gpt4 book ai didi

Delphi 在另一张图像上绘制 png 文件的一部分

转载 作者:行者123 更新时间:2023-12-02 02:22:36 25 4
gpt4 key购买 nike

我正在使用此函数在特定位置的 TImage 上绘制 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, 0, fg.Width, fg.Height));
Image3.Picture.Graphic := bg;
finally
fg.Free;
end;
finally
bg.Free;
end;

end;

Output

要仅绘制一部分,一个可能的解决方案是获取 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,
100,
200,
200,
fgbm.Canvas.Handle,
200,
200,
200,
200,
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;

Output

关于Delphi 在另一张图像上绘制 png 文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66187763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com