[C] Win GDI: seltsames Ergebnis bei Maskierung mit Rasteroperationen

BlackBox

Cadet 4th Year
Registriert
Sep. 2004
Beiträge
119
Hallo zusammen

[Edit: Lösung gefunden s.u.]

Ich möchte mit der Win GDI ein Bitmap mit transparentem Hintergrund darstellen (durch Maskierung).Ich habe das Ganze bereits in C implementiert und es funktioniert im Prinzip einwandfrei, bis auf eines: wenn ich als transparente Farbe eine andere FArbe als Schwarz oder Weiß verwende, werden sämtliche Farben des Bitmaps falsch dargestellt. An dem Problem scheinen die folgenden Codezeilen schuld zu sein:

Code:
//Maske des Bildausschnitts erzeugen: 
//alle lila pixel als weiß, der rest schwarz; dann invertieren
SetBkColor(hdcMemTile,RGB(255,0,255));
BitBlt(hdcMemMask,0,0,Width, Height,hdcMemTile,0,0,NOTSRCCOPY);

//Bildausschnitt maskieren: lila Hintergrund wird schwarz
BitBlt(hdcMemTile,0,0,Width, Height,hdcMemMask,0,0,SRCAND);
Als Maske wird ein monochromes Bitmap verwendet, die transparenten Flächen sind Schwarz (Bitwert 0), alle darzustellenden Pixel sind Weiß (bitwert 1). Jetzt wird das Sprite maskiert, d.h. alle lila pixel sollen auf Schwarz gesetzt werden. Dazu wird die Maske in das Sprite kopiert, als Raster-Operationscode wird SRCAND genutzt (Ziel= Ziel & Quelle).
Als Ergebnis sollten alle lila Pixel schwarz sein (bitwert 1[Ziel] & bitwert 0[Quelle] = bitwert0[schwarz]), alle andersfarbigen pixel sollten ihre farbe behalten (bitwert 1[Ziel] & bitwert 1[Quelle] = bitwert 1[farbig]).

Wenn ich der Funktion SetBkColor() eine andere Farbe als (255,255,255)übergebe,behalten die farbigen Pixel des Sprites nach der beschriebenen Operation aber nicht ihre alte Farbe, sondern haben eine ganz andere (was eigentlich überhaupt nicht möglich ist).

Ich hoffe die Erklärung war halbwegs verständlich. Hat jemand eine Ahnung, wodurch mein Problem entsteht oder was man dagen machen kann? Ich bin völlig ratlos und für jede Hilfe dankbar.

//Edit: Hab jetzt nach viel probieren endlich eine (unverschämt einfache) Lösung gefunden: alte Hintergrundfarbe speichern und vor der Maskierung wieder einsetzen.
Verdammt, warum bin ich manchmal so dumm?! Tut mir leid, euch damit belästigt zu haben ;)
 
Zuletzt bearbeitet:
Zurück
Oben