Hallo,
ich erzeuge auf einer Bitmap32 einen Text mit Kantenglättung. Hiervon verwende ich nur die AlphaMap - dort wo ich später in
OpenGL den Text stehen haben möchte, wird also Farbe oder eine Textur "entsprechend" intensiv aufgetragen.
Leider muss meine Grafik komplett weiß sein (sich also nur in den Alpha-Werten unterscheiden), und beim Antialiasing kommen durch die Windows-
Api leider auch andere Grau- und Farbwerte zum Einsatz.
Prozeduren wie bmp32.FillRect(0,0,512,512,Color32(255,255,255)); funktionieren leider nicht, da damit auch der Alpha-Kanal neu gesetzt wird (und damit auch die Alpha-Informationen für meinen Text verloren gehen.
Frage:
a) Gibt es eine Möglichkeit, das Bitmap32 vor Veränderungen an den Alphawerten zu schützen? Oder
b) Kann ich mir die Alpha-Werte aller Pixel des Bitmap32 auf ein neues, leeres Bitmap32 rüberkopieren ohne die
RGB Informationen ?
Aktuell verwende ich diese Prozedur, die dauert aber auch auf einem aktuellen System über 100ms, und ich muss *viele* verschieden (~artige) Texte zeichnen...
Danke vorab!
Delphi-Quellcode:
for x := 0 to bmp.Width - 1 do begin
for y := 0 to bmp.Height - 1 do begin
cl := bmp.Pixel[x, y];
Color32ToRGBA(cl, r, g, b, a);
r := 255;
g := 255;
b := 255;
bmp.Pixel[x,y] := Color32(r, g, b, a)
end;
end;
Klar, über ScanLine kann ich da bestimmt noch ein paar ms rausholen... Aber gibt es nicht evtl. "FillRect" nur für
RGB, ohne Alpha? Oder sowas wie "CopyAlphaMask", BitBlt, Maskblt, BitmapORBitmap2 ...?
Hier ist übrigens die ScanLine-Variante:
Delphi-Quellcode:
Line: PColor32Array;
for y:=0 to bmp.Height-1 do
begin
Line:=bmp.ScanLine[Y];
for x:=0 to bmp.Width-1 do
begin
Color32ToRGBA(Line[x], r, g, b, a);
Line[x] := Color32(255, 255, 255, a)
end;
end;
Edit: Mit BitBlt und SRCPAINT scheint es zu klappen. Da von beiden Bitmaps die "stärkeren" Bits genommen werden, und bmp2 komplett durchsichtig ist, wird am Ende das "stärkere" Alpha von bmp genommen, aber die "stärkere" Farbe (Weiß) von bmp2.
Delphi-Quellcode:
bmp2 := TBitmap32.Create;
try
bmp2.Width := bmp.Width;
bmp2.Height := bmp.Height;
bmp2.Clear(Color32(255,255,255,0));
BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width,bmp.Height,bmp2.Canvas.Handle, 0, 0, SRCPAINT);
finally
FreeAndNil(bmp2);
end;
Spricht was gegen diese Lösung?
Danke fürs Lesen, Thema erledigt.
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit