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
Antwort
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
Funktioniert super danke! – CareTaker22
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
optimiertWenn 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);
}
}
}
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);
}
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! –
PS: Ihre C# -Syntax ist in Ordnung, solange 'system.Drawing;' und 'system.Drawing.Imaging;' verwendet werden. –
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) –
Kann ich etwas zu meiner Antwort hinzufügen, da Sie keine Antwort akzeptiert haben? – Cloudanger
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