Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Erledigt] Bitmap32 nur RGB ändern oder nur Alphamap kopieren (https://www.delphipraxis.net/209518-%5Berledigt%5D-bitmap32-nur-rgb-aendern-oder-nur-alphamap-kopieren.html)

berens 16. Dez 2021 12:09


[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:
    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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz