Einzelnen Beitrag anzeigen

Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: TBitmap.draw und transparenz

  Alt 22. Jun 2012, 20:49
Delphi-Quellcode:

type
  pRGBQuadArray = ^TRGBQuadArray;
  TRGBQuadArray = ARRAY[0..$effffff] OF TRGBQuad;


Procedure SetAlpha(bmp:TBitMap;Alpha:Byte);
// 20120622 by Thomas Wassermann
var
 pscanLine32 : pRGBQuadArray;
 i,j:Integer;
 begin
   Bmp.PixelFormat := pf32Bit;
   bmp.HandleType := bmDIB;
   bmp.ignorepalette := true;
   bmp.alphaformat := afDefined;
   for i := 0 to bmp.Height -1 do
     begin
     pscanLine32 := bmp.Scanline[i];
     for j := 0 to bmp.Width -1 do
        begin
          pscanLine32[j].rgbReserved := Alpha;
          pscanLine32[j].rgbBlue := 0;
          pscanLine32[j].rgbRed := 0;
          pscanLine32[j].rgbGreen := 0;
        end;
     end;
 end;

procedure TForm5.Button1Click(Sender: TObject);
var
  Bmp,bmp2: TBitmap;
  p : TPNGImage;
begin
  Bmp:=TBitmap.Create;
  Bmp2:=TBitmap.Create;
  bmp2.Width := 300;
  bmp2.height := 300;
  SetAlpha(bmp2,0);
  p:=TPNGImage.Create;
  try
    p.LoadFromFile('C:\Icons\IconCollection\ix_ap_all\48x48\shadow\about.png');
    Bmp.Assign(p);
    bmp2.Canvas.Draw(0,0,bmp);
    bmp2.Canvas.Draw(50,50,bmp);
    Canvas.Draw(0,0,bmp);
    Canvas.Draw(100,100,bmp2);
  finally
    Bmp.Free;
    bmp2.Free;
    p.Free;
  end;
end;

ich habe gerade mal experimentiert ... man kann auch mit GDI+ wie erwartet malen (Alpha verhält sich wie gewünscht im Gegensatz zu den Canvasroutinen), auch ein Image behält die Transparenz.

Delphi-Quellcode:
procedure TForm5.Button1Click(Sender: TObject);
var
  Bmp,bmp2: TBitmap;
  p : TPNGImage;
  g : TGPGraphics;
  b:TGPSolidBrush;
begin
  Bmp:=TBitmap.Create;
  Bmp2:=TBitmap.Create;
  bmp2.Width := 300;
  bmp2.height := 300;
  SetAlpha(bmp2,50);
  p:=TPNGImage.Create;
  try
    p.LoadFromFile('C:\Icons\IconCollection\ix_ap_all\48x48\shadow\about.png');
    Bmp.Assign(p);
    bmp2.Canvas.Draw(20,20,bmp);
    bmp2.Canvas.Draw(50,50,bmp);
    g := GetGraphics(bmp2.Canvas);
    b := GetSolidBrush(clRed,128);
    try
      g.FillRectangle(b,100.0,100.0,100.0,100.0);
      g.FillRectangle(b,150.0,150.0,100.0,100.0);
      Canvas.Draw(100,100,bmp2);
      image1.Picture.Assign(bmp2);

    finally
      g.Free;
      b.Free;
    end;
  finally
    Bmp.Free;
    bmp2.Free;
    p.Free;
  end;
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi (23. Jun 2012 um 07:49 Uhr)
  Mit Zitat antworten Zitat