簡體   English   中英

如何在Delphi中使用alpha透明度繪制透明度?

[英]How to draw transparent with alpha transparency in Delphi?

我想用alpha透明矩形和alpha透明圖像繪制非常復雜的圖像。 有來自Mitov的GDI +包裝器 ,但它似乎不支持32位BMP文件加上它重新調整它們並且文檔非常糟糕。 BMP比PNG更快,所以我想使用它們。 有GDI +的SynGDI包裝器 ,但它看起來很基本,沒有它的文檔。 GDI還有這個技巧:

procedure DrawAlphaAPI(Source: TBitmap; Destination: TCanvas;
  const X, Y: Integer; const Opacity: Byte = 255);
var  BlendFunc: TBlendFunction;
begin
  BlendFunc.BlendOp := AC_SRC_OVER;
  BlendFunc.BlendFlags := 0;
  BlendFunc.SourceConstantAlpha := Opacity;

  if Source.PixelFormat = pf32bit then
    BlendFunc.AlphaFormat := AC_SRC_ALPHA
  else
    BlendFunc.AlphaFormat := 0;

  Windows.AlphaBlend(Destination.Handle, X, Y, Source.Width, Source.Height,
  Source.Canvas.Handle, 0, 0, Source.Width, Source.Height, BlendFunc);
end;

但是當我用Opacity = 255調用它時,它不能正確地繪制32位位圖(就像它們應該是完全的半透明一樣)。 我不想使用Scanline來使像素透明,因為這太復雜了,無法以這種方式繪制所有透明矩形。 另外我在現代計算機上應該更快GDI +,我是對的嗎?

所以問題是:如何輕松繪制alpha透明矩形和位圖(沒有大量的代碼)?

首選德爾福:7。我也有2005和XE3,但由於7是速度惡魔,我最希望從7開始工作。

如果您准備普通的TBitmap,可以使用任何GDI +實現只分配bmp.Canvas.Handle。 編譯中的問題可能是由文件夾中的舊DirctDraw-Version引起的,只需將其刪除即可。

implementation

uses GDIPAPI, GDIPOBJ;
{$R *.dfm}

Procedure PrepareBMP(bmp: TBitmap; Width, Height: Integer);
var
  p: Pointer;
begin
  bmp.PixelFormat := pf32Bit;
  bmp.Width := Width;
  bmp.Height := Height;
  bmp.HandleType := bmDIB;
  bmp.ignorepalette := true;
  bmp.alphaformat := afPremultiplied;
  // clear all Scanlines
  p := bmp.ScanLine[Height - 1];
  ZeroMemory(p, Width * Height * 4);
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  bmp: TBitmap;
  G: TGPGRaphics;
  B: TGPSolidBrush;
begin
  bmp := TBitmap.Create;
  try
    PrepareBMP(bmp, 300, 300);
    G := TGPGRaphics.Create(bmp.Canvas.Handle);
    B := TGPSolidBrush.Create(MakeColor(100, 255, 0, 0));
    try
      G.SetSmoothingMode(SmoothingModeHighQuality);
      G.FillEllipse(B, MakeRect(0.0, 0, 300, 300));
      B.SetColor(MakeColor(100, 0, 255, 128));
      G.FillEllipse(B, MakeRect(40.0, 40, 260, 260));
    finally
      B.Free;
      G.Free;
    end;
    // draw overlapping in Form Canvas to display transparency
    Canvas.Draw(0, 0, bmp);
    Canvas.Draw(100, 100, bmp);
  finally
    bmp.Free;
  end;
end;

DEMO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM