2012-03-26 15 views
6

Her görüntüyü oluşturmak için farklı alfa katmanlarına sahip tek renkli olan her biri (84 toplam) 3 boyuta sahip 28 resmim var. Her birini 5 farklı renkte yapmak istiyorum. Bu toplam 420 görüntü olacaktır. Bu açıkça, elle yapmak için büyük bir acı olurdu. Photoshop'um yok, bu yüzden herhangi bir photoshop işlevi türü geçerli bir cevap değil. Paint.NET'im var ama ayarlama tonu benim için çalışmıyor çünkü sadece tonu değiştirmek istediğim renkleri vermiyor.Bir .png'yi nasıl programlı olarak düzenlersiniz?

Temel olarak, yapmam gereken şey, görüntüdeki her piksel için RGBA değerini alması ve RGB'yi yeni bir RGB değeriyle değiştirmesi ve aynı A değerini tutmasıdır.

Bunu nasıl yapacağını bilen var mı? StackOverflow veya Google'da arama yapma şansım olmadı (muhtemelen yanlış arama terimlerini kullanarak).

C# veya VB.NET'te bir yanıtı tercih ederim, ancak herhangi bir dilde bunu nasıl yapacağını bilen varsa, bunu C# veya VB.NET'e uygulayabilirim.

herkes bu bulur ve cevap aradığı durumda --Edit--

, burada ben Yorye Nathan'dan linke dayalı var zaten.

private const int RED = 51; 
private const int GREEN = 181; 
private const int BLUE = 229; 

private const int NEW_RED = 170; 
private const int NEW_GREEN = 102; 
private const int NEW_BLUE = 204; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
    { 

    Image OriginalImage = Image.FromFile(openFileDialog1.FileName); 
    Image NewImage = ColorFilter(OriginalImage); 

    pictureBox1.Image = OriginalImage; 
    pictureBox2.Image = NewImage; 
    } 

} 

public static Image ColorFilter(Image originalImage) 
{ 
    Bitmap newImage = new Bitmap(originalImage); 
    BitmapData originalData = (originalImage as Bitmap).LockBits(new Rectangle(0, 0, originalImage.Width, originalImage.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

    BitmapData newData = (newImage as Bitmap).LockBits(new Rectangle(0, 0, originalImage.Width, originalImage.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); 

    int originalStride = originalData.Stride; 
    System.IntPtr originalScan0 = originalData.Scan0; 

    int newStride = newData.Stride; 
    System.IntPtr newScan0 = newData.Scan0; 

    unsafe 
    { 
    byte* pOriginal = (byte*)(void*)originalScan0; 
    byte* pNew = (byte*)(void*)newScan0; 

    int nOffset = originalStride - originalImage.Width * 4; 

    byte red, green, blue; 

    for (int y = 0; y < originalImage.Height; ++y) 
    { 
     for (int x = 0; x < originalImage.Width; ++x) 
     { 
     blue = pOriginal[0]; 
     green = pOriginal[1]; 
     red = pOriginal[2]; 

     if (pOriginal[0] == BLUE && pOriginal[1] == GREEN && pOriginal[2] == RED) 
     { 
      pNew[0] = (byte)NEW_BLUE; 
      pNew[1] = (byte)NEW_GREEN; 
      pNew[2] = (byte)NEW_RED; 
     } 

     pOriginal += 4; 
     pNew += 4; 
     } 
     pOriginal += nOffset; 
     pNew += nOffset; 
    } 
    } 
    (originalImage as Bitmap).UnlockBits(originalData); 
    (newImage as Bitmap).UnlockBits(newData); 
    return newImage; 
} 
+1

Bu kodu (seçili bir dizindeki tüm resimlerin arasında döngü yapmak ve çıktı yolunu değiştirmek gibi birkaç ince ayar ile) çalıştırdım ve bir saniyenin altındaki tüm 420 görüntüyü oluşturdum. El emeği enayiler içindir. – Nick

cevap

4

Bunu kontrol edin question out. Piksel bitleri yerine küçük bir parça koyup değiştirerek yerine eklemelerini sağlayın.

+0

Teşekkürler, tam ihtiyacım olan buydu. Soruyu güncelledim ve arama sonuçlarında başkalarının buna rastlaması durumunda çözümümümü yayınladım. – Nick

+0

Harika, iyi şanslar :) – SimpleVar

İlgili konular