Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bitmap 32Bit und Alpha Kanal (https://www.delphipraxis.net/197936-bitmap-32bit-und-alpha-kanal.html)

tomkupitz 19. Sep 2018 14:53

Bitmap 32Bit und Alpha Kanal
 
Hallo,

ich habe eine Bitmap erstellt:
Code:
  tmp:=TBitmap.Create;
  tmp.SetSize(bmp.Width, bmp.Height);

  tmp.PixelFormat:=pf32Bit;
  tmp.AlphaFormat:=afDefined;

  ...

  tmp.Free;
Der Alphakanal gibt die Transparenz für den jeweiligen Pixel an.

Wenn ich nun die Bitmap so bearbeite
Code:
 
  Line: PRGBQuadArray;

  ...

  R:=0; G:=0; B:=0; Alpha:=0;
 
  for y:=0 to tmp.Height-1 do
  begin
    Line:=tmp.ScanLine[Y];

    for x:=0 to tmp.Width-1 do
    begin
      Line[X].rgbRed:=R;
      Line[X].rgbGreen:=G;
      Line[X].rAgbBlue:=B;
      Line[X].rgbReserved:=Alpha;
    end;
  end;
ist sie bei Ausgabe mit
Code:
Canvas.Draw(0, 0, tmp);
völlig tranzparent. Bei einer Bearbeitung mit
Code:
 
  Line: PRGBQuadArray;

  ...

  R:=255; G:=255; B:=255; Alpha:=0;
 
  for y:=0 to tmp.Height-1 do
  begin
    Line:=tmp.ScanLine[Y];

    for x:=0 to tmp.Width-1 do
    begin
      Line[X].rgbRed:=R;
      Line[X].rgbGreen:=G;
      Line[X].rAgbBlue:=B;
      Line[X].rgbReserved:=Alpha;
    end;
  end;
ist sie bei Ausgabe mit
Code:
Canvas.Draw(0, 0, tmp);
nur halbtranzparent.

Habe ich da ein Verständnisproblem?

Beste Grüße

Medium 19. Sep 2018 16:49

AW: Bitmap 32Bit und Alpha Kanal
 
Bei Bitmap32 brauchst du die Verrenkung mit der Scanline nicht mehr zu machen. Die Eigenschaft Pixels[] ist dort anders, und weitaus performanter umgesetzt als bei den alten VCL Bitmaps. Versuche mal, die Farben so zuzuweisen:
Delphi-Quellcode:
  R:=0; G:=0; B:=0; Alpha:=0;
 
  for y:=0 to tmp.Height-1 do
    for x:=0 to tmp.Width-1 do
      tmp.Pixels[x, y] := Color32(R, G, B, A);
Das zeichnen dann besser auch anders herum: tmp.DrawTo(Canvas.Handle), da Canvas.Draw() den Alpha-Kanal möglicherweise nicht beachtet. Sicher bin ich mir nicht, aber mit der hier genannten Variante bin ich immer gut gefahren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:43 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