2012-03-26 8 views
6

I habe 28 Bilder, die jeweils 3 Größen (84 insgesamt), die alle mit verschiedenen monochromen alpha Schichten jedes Bild zu machen. Ich möchte jeden in 5 verschiedenen Farben verfügbar machen. das wären 420 Bilder insgesamt. Dies wäre natürlich ein großer Schmerz, manuell zu tun. Ich habe kein Photoshop, also ist jede Art von Photoshop-Funktion keine gültige Antwort. Ich habe Paint.NET aber die einstellen Farbton für mich nicht funktioniert, weil der Farbton ändert allein mir nicht geben, die Farben, die ich will.Wie bearbeite Sie eine .png programmatisch?

Im Grunde, was ich tun muß, ist für jedes Pixel im Bild, nehmen Sie den Wert RGBA und ersetzen Sie die RGB mit einem neuen Wert RGB und halten die A-Wert gleich.

Wer weiß, wie man das macht? Ich hatte kein Glück bei der Suche auf StackOverflow oder Google (wahrscheinlich mit den falschen Suchbegriffen).

würde ich eine Antwort in C# oder VB.NET bevorzugen, aber wenn jemand weiß, wie dies vielleicht in jeder Sprache zu tun, kann ich es in C# oder VB.NET anzuwenden.

--Edit--

Falls dies jemand findet und für die Antwort suchen, ist hier, was ich auf den Link von Yorye Nathan bekam basiert.

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

Ich habe diesen Code (mit ein paar Optimierungen, wie das Durchlaufen aller Bilder in einem ausgewählten Verzeichnis und Ändern des Ausgabepfads) ausgeführt und alle 420 Bilder in weniger als einer Sekunde erzeugt. Handarbeit ist für Saugnäpfe. – Nick

Antwort

4

Überprüfen Sie diese question aus. Zwicken ein wenig mit den Bits Ersatz des Pixels, um es ihnen zu machen hinzufügen, anstatt sie zu ersetzen, und Sie sind gut zu gehen.

+0

Danke, das war genau was ich brauchte. Ich habe die Frage aktualisiert und meine Lösung gepostet, falls jemand anderes bei einer Suche darauf stoßen sollte. – Nick

+0

Großartig, viel Glück :) – SimpleVar

Verwandte Themen