Einzelnen Beitrag anzeigen

Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Graphics32 und Aplhatransparenz

  Alt 22. Jul 2005, 17:33
Es kommt darauf an welches Alpha du meinst. Die G32 kennt nämlich 2 Werte dafür:

1) Den Per-Pixel-Alpha der für jeden Farbwert zusätzlich im höchstwertigen Byte von TColor32 hinterlegt wird
2) Den Master-Alpha - ein Byte dass für das gesamte TBitmap32 gilt

(1) lässt sich entweder durch direktes Zuweisen per Pixel manipulieren, oder mit IntensityToAlpha(). D.h. du hast z.B. ein .bmp mit deinem Bild, und ein zugehöriges s/w-bmp dass den Alphakanal beschreibt. Dann läsdst du als erstes dein bmp in ein TBitmap32, und dein Alpha-Bild in ein zweites. Dieses machst du nun per IntensityToAlpha() zum Alphachannel des ersten (und kannst das TBitmap32 für das Alpha dann auch wieder freigeben).

Damit du aber überhaupt was davon merkst, musst du TBitmap32.DrawMode auf dmBlend setzen! Standard ist dmOpaque, bei dem Alpha komplett ignoriert wird. Wenn du nun also ein TBitmap32 via Draw oder DrawTo zeichnest, dann wird dein Alpha berücksichtigt. Was aber nicht geht ist, dass andere Controls o.ä. durchscheinen. Das wirkt imho nur beim Zeichnen von TBitmap32 auf TBitmap32 (bin mir jedoch auf einmal nicht mehr 100%ig sicher ).

Für (2) einfach TBitmap32.MasterAlpha auf einen Wert 0..255 setzen. Hier gilt alles obige mit, und dieser Wert wird imho mit den per-pixel Werten verrechnet. (Ich habe jeoch bisher nie MasterAlpha und Pixel-Alpha in Kombination eingesetzt. Müsste aber einfach so klappen.) Der DrawMode hat auch hier Auswirkungen.



Das Alpha-Bild muss allerdings nicht zwangsläufig s/w sein. Es geht jedes, wobei die einzelnen Farbwerte zu einer Intensität verrechnet werden (also in s/w umgewandelt). Dabei wäre darauf zu achten, dass es sein kann dass die G32 da "richtig" vorgeht, also 255er Grün weitaus intensiver wertet als 255er Blau, da es dem Menschen ja heller erscheint. Somit ist man wenn man von vorne herein s/w-Bilder verwendet auf der sicheren Seite.
Das Laden, da über 2 TBitmaps32, ist etwas umständlich, aber es gibt imho keine Funktion Formate zu laden die den Alpha integriert haben (.png z.B.). Man könnte sich aber spaßeshalbar ein TBitmap32 ableiten oder ne Funktion schreiben der man einfach beide Filenames übergibt, und den Kleinkram zentral erledigt (wenn man öfter sowas zu laden hat).


Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat