【发布时间】:2013-03-14 23:40:03
【问题描述】:
我想用 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 位位图(就像它们在应该完全透明的地方是半透明的)。 我不想使用 Scanline 使像素透明,因为这样绘制所有透明矩形太复杂了。 另外我认为 GDI+ 在现代计算机上应该更快,对吗?
那么问题来了:如何轻松绘制 alpha 透明矩形和位图(无需大量代码)?
首选 Delphi:7。我也有 2005 和 XE3,但由于 7 是速度恶魔,我最希望从 7 开始工作。
【问题讨论】:
-
如果你可以使用支持Delphi 2009 up的
this wrapper,你可能会写code like this,看起来很复杂,但是你需要知道你可以用那个颜色矩阵修改color adjustment和我正在加载一个要在该代码中混合 alpha 的文件(例如,您可以从传递的TBitmap对象创建一个GPBitmap)。 -
@TLama 谢谢,这个 GDI+ 似乎是迄今为止最好的。其他都很烂。 Progdigy 的一个无法编译(7、2005 和 XE3),Mitov 的一个在绘制后破坏图像,Synopse 的一个不完整。
-
FWIW:我发现these articles 很有趣。
-
@UliGerhardt 确实很有趣。谢谢!
标签: image delphi graphics gdi+