我想用 alpha 透明矩形和 alpha 透明图像绘制相当复杂的图像。 There is GDI+ wrapper from Mitov ,但它似乎不支持 32 位 BMP 文件,而且它会重新缩放它们,而且文档很糟糕。 BMP 比 PNG 快得多,所以我想使用它们。 There is SynGDI wrapper of GDI+ ,但它似乎非常基本,并且没有相关文档。 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 位位图(就像它们在应该完全透明的地方是半透明的)。 我不想使用扫描线使像素透明,因为这样太复杂,无法以这种方式绘制所有透明矩形。 另外,我认为 GDI+ 在现代计算机上应该更快,对吗?
所以问题是:如何轻松绘制 alpha 透明矩形和位图(无需大量代码)?
首选 Delphi:7。我也有 2005 和 XE3,但由于 7 是一个速度恶魔,我最希望有一些东西可以从 7 开始工作。
最佳答案
如果您准备普通的 TBitmap,则只需分配 bmp.Canvas.Handle 即可使用任何 GDI+ 实现。 您的编译问题可能是由文件夹中旧的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;
关于image - 如何在Delphi中用alpha透明度绘制透明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15422237/