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