大佬教程收集整理的这篇文章主要介绍了Delphi 在另一个图像上绘制 png 文件的一部分,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用此函数在特定位置的 @R_419_5411@ 上绘制 png:
procedure TForm1.PlacePNG(nam: String; px,py: Integer);
var
vPic: TPicture;
vSrc: TGraphic;
begin
vPic := TPicture.Create;
try
vPic.LoadFromfile(Nam);
vSrc := vPic.Graphic;
Image1.Canvas.Draw(px,py,vSrc);
finally
vPic.Free;
end;
end;
我的问题:使用 png 文件的部分做到这一点的最佳方法是什么,同时又不失去其透明度?
这是一个有趣的问题!
当然,绘制整个 PNG 是微不足道的:
procedure TForm1.FormCreate(Sender: TObject);
var
bg,fg: TPngImage;
begin
bg := TPngImage.Create;
try
bg.LoadFromFile('K:\bg.png');
fg := TPngImage.Create;
try
fg.LoadFromFile('K:\fg.png');
Image1.Picture.Graphic := bg;
Image2.Picture.Graphic := fg;
fg.Draw(bg.Canvas,Rect(0,fg.Width,fg.Height));
Image3.Picture.Graphic := bg;
finally
fg.Free;
end;
finally
bg.Free;
end;
end;
要仅绘制一部分,一种可能的解决方案是获取 32-bpp RGBA 位图形式的图像,然后使用 Windows API,特别是 AlphaBlend
函数:
procedure TForm1.FormCreate(Sender: TObject);
var
bg,fg: TPngImage;
bgbm,fgbm: TBitmap;
BlendFunction: TBlendFunction;
begin
// Load BACkground PNG
bg := TPngImage.Create;
try
bg.LoadFromFile('K:\bg.png');
// Load foreground PNG
fg := TPngImage.Create;
try
fg.LoadFromFile('K:\fg.png');
// Preview BACkground and foreground
Image1.Picture.Graphic := bg;
Image2.Picture.Graphic := fg;
// Create BACkground BMP
bgbm := TBitmap.Create;
try
bgbm.Assign(bg);
// Create foreground BMP
fgbm := TBitmap.Create;
try
fgbm.Assign(fg);
// Blend PART OF foreground BMP onto BACkground BMP
BlendFunction.blendop := AC_SRC_OVER;
BlendFunction.blendFlags := 0;
BlendFunction.sourceConstantAlpha := 255;
BlendFunction.AlphaFormat := AC_SRC_ALPHA;
if not Winapi.Windows.AlphaBlend(
bgbm.Canvas.Handle,100,200,fgbm.Canvas.Handle,BlendFunction
) then
RaiseLastOSError;
// Preview result
Image3.Picture.Graphic := bgbm;
finally
fgbm.Free;
end;
finally
bgbm.Free;
end;
finally
fg.Free;
end;
finally
bg.Free;
end;
end;
以上是大佬教程为你收集整理的Delphi 在另一个图像上绘制 png 文件的一部分全部内容,希望文章能够帮你解决Delphi 在另一个图像上绘制 png 文件的一部分所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。