AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi [Erledigt] Bitmap32 nur RGB ändern oder nur Alphamap kopieren

[Erledigt] Bitmap32 nur RGB ändern oder nur Alphamap kopieren

Ein Thema von berens · begonnen am 16. Dez 2021
Antwort Antwort
berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#1

[Erledigt] Bitmap32 nur RGB ändern oder nur Alphamap kopieren

  Alt 16. Dez 2021, 12:09
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

Geändert von berens (16. Dez 2021 um 12:43 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:59 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