![]() |
[Erledigt] Bitmap32 nur RGB ändern oder nur Alphamap kopieren
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:
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 ...?
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; 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:
Spricht was gegen diese Lösung?
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; Danke fürs Lesen, Thema erledigt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz