2010-08-01 3 views
6

Ich arbeite mit Bitmap C# und frage mich, wie Sie eine Farbe PNG-Bild in nur eine Farbe konvertieren. Ich möchte, dass alle sichtbaren Farben im Bild weiß werden. Die Teile, die transparent sind, sollten transparent bleiben. Ich werde diese gegen einen grauen Hintergrund anzeigen.Convert transparent PNG in Farbe auf einzelne Farbe

+0

möglich Duplikat [GDI +: Stellen Sie alle Pixel zu bestimmten Farbe während vorhandenen Alpha-Wert beibehalten] (http://stackoverflow.com/questions/2510013/gdi-set-all- pixels-to-given-color-while-existing-existing-alpha-value) –

+0

Kann ich etwas zu meiner Antwort hinzufügen, da Sie keine Antwort akzeptiert haben? – Cloudanger

+0

Hallo und Entschuldigung für die späte Antwort. Ich habe den Code gerade ausprobiert und kann es nicht funktionieren lassen. Alle meine Pixel werden weiß und die transparenten Pixel der PNGs bleiben nicht erhalten. – jesperlind

Antwort

7

Die anderen Antworten waren hilfreich und brachten mich zum Laufen, vielen Dank. Ich konnte sie nicht arbeiten lassen, nicht sicher warum. Aber ich fand auch heraus, dass ich den ursprünglichen Alpha-Wert der Pixel beibehalten wollte, um die Kanten glatt zu machen. Das ist, was mir eingefallen ist.

for (int x = 0; x < bitmap.Width; x++) 
{ 
    for (int y = 0; y < bitmap.Height; y++) 
    { 
     Color bitColor = bitmap.GetPixel(x, y); 
     //Sets all the pixels to white but with the original alpha value 
     bitmap.SetPixel(x, y, Color.FromArgb(bitColor.A, 255, 255, 255)); 
    } 
} 

Hier ist ein Bildschirmausdruck des Ergebnisses ein paar Mal vergrößert (original oben): alt text http://codeodyssey.se/upload/white-transparent.png

+0

Funktioniert super danke! – CareTaker22

1

try folgenden Code:

void Test() 
    { 
     Bitmap bmp = new Bitmap(50, 50);//you will load it from file or resource 

     Color c = Color.Green;//transparent color 

     //loop height and width. 
     // YOU MAY HAVE TO CONVERT IT TO Height X VerticalResolution and 
     // Width X HorizontalResolution 
     for (int i = 0; i < bmp.Height; i++) 
     { 
      for (int j = 0; j < bmp.Width; j++) 
      { 
       var p = bmp.GetPixel(j, i);//get pixle at point 

       //if pixle color not equals transparent 
       if(!c.Equals(Color.FromArgb(p.ToArgb()))) 
       { 
        //set it to white 
        bmp.SetPixel(j,i,Color.White); 
       } 
      } 
     } 
    } 

PS: nicht getestet wird und in keiner Weise

optimiert
7

Wenn das Bild Alpha-Kanal für Transparenz nicht verwendet dann das Folgende tun:

Bitmap image; 

for (int x = 0; x < image.Width; x++) 
{ 
    for (int y = 0; y < image.Height; y++) 
    { 
     if (image.GetPixel(x, y) != Color.Transparent) 
     { 
      image.SetPixel(x, y, Color.White); 
     } 
    } 
} 
4

SetPixel nur um die langsamste mögliche Weg ist, das zu tun. Sie können ein verwenden ColorMatrix statt:

var newImage = new Bitmap(original.Width, original.Height, 
          original.PixelFormat); 

using (var g = Graphics.FromImage(newImage)) { 
    var matrix = new ColorMatrix(new[] { 
     new float[] { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f }, 
     new float[] { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }, 
     new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }, 
     new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 0.0f }, 
     new float[] { 1.0f, 1.0f, 1.0f, 0.0f, 1.0f } 
    }); 

    var attributes = new ImageAttributes(); 

    attributes.SetColorMatrix(matrix); 

    g.DrawImage(original, 
       new Rectangle(0, 0, original.Width, original.Height), 
       0, 0, original.Width, original.Height, 
       GraphicsUnit.Pixel, attributes); 
} 
+0

Sicherlich eleganter, mit dem zusätzlichen Vorteil, dass man einen ganz neuen Farbraum lernen muss, ein neues Konzept der Farbmanipulation, und dieses neue Wissen verwendet, um zu verstehen, was Sie gerade getan haben. :) Ich liebe es! –

+0

PS: Ihre C# -Syntax ist in Ordnung, solange 'system.Drawing;' und 'system.Drawing.Imaging;' verwendet werden. –