GDI+ und Probleme mit SetPixel
-
Ich strukturiere momentan eine Anwendung von mir um und wollte sie dabei auch gleich von GDI auf GDI+ abändern. Leider musste ich feststellen, dass die DrawImage Funktion von GDI+ keine manuelle Wahl der transparenten Farbe bei Bitmaps mehr zulässt. Stattdessen wird mit Alphablending gearbeitet.
Da ich es bisher so gehandhabt habe, dass ich meine sämtlichen Grafiken (mehrere hundert) auf weißen Hintergrund gespeichert habe und im C++ Code gesagt habe, es solle die Farbe Weiß als Transparenzfarbe nehmen, habe ich mir einen simplen Änderungsalgorithmus entworfen.
Bitmap Knoten(W_Name); int PIXEL_X = Knoten.GetWidth(); int PIXEL_Y = Knoten.GetHeight(); Color Farbe; for (int A = 0; A < PIXEL_X; A++) { for (int B = 0; B < PIXEL_Y; B++) { Knoten.GetPixel(A,B,&Farbe); if ( Farbe.GetRed() == 255 && Farbe.GetBlue() == 255 && Farbe.GetGreen() == 255) { Knoten.SetPixel(A,B,Color(0,255,255,255)); } } } graphics.DrawImage(&Knoten,koordinate.x + pGraph->GetMittelpunkt().x -15, koordinate.y + pGraph->GetMittelpunkt().y - 15);
Theoretisch sollte der Algorithmus so funktionieren, dass er jeden Pixel eines Bildes (Knoten) nach der Farbe Weiß kontrolliert und im Verifizierungsfall den Alphawert auf 0 abändert.
Leider klappt dies nicht. Obwohl sichergestellt ist, dass die innere IF-Anweisung durchlaufen wird (und damit dass GetPixel funktioniert), ändert der SetPixel Befehl die entsprechenden Pixel nicht. Das Bild wird immer noch wie das Original gezeichnet. Selbst wenn ich mir eine Schleife bastel, die einfach alle Pixel auf Schwarz setzen soll, so geschieht nichts.
Woran könnte das liegen?
-
Hallo,
dein Code macht eigentlich nichts anderes als weiße Punkte im Bild zu suchen und diese durch weiße Punkte auszutauschen
von daher ist der Algo. korrekt aber eigentlich nutzlos, aber ich habe eine andere Lösung für Dich, da ich mich selber auch gerade ein wenig mit der GDI+ befasse:
ImageAttributes imAtt; imAtt.SetColorKey(Color(255, 255, 255), // Alpha Wert von... Color(255, 255, 255), // bis ColorAdjustTypeBitmap); graph->DrawImage(bild, Rect(20, 20, bild->GetWidth(), bild->GetHeight()), 0, 0, bild->GetWidth(), bild->GetHeight(), UnitPixel, &imAtt);
bild ist dabei ein Bitmap bzw. Image Objekt. Damit wird die Farbe Weiß beim Zeichnen automatisch transparent gemacht.
Gruß
paddy