我想将PNG图像的内容复制到另一个更大的图像。源图像是16x16x32b,目标是相同的格式,但宽了两倍。但是,下面的代码将产生空白图像。将COLOR_RGBALPHA更改为COLOR_RGB会生成非透明的PNG。如何正确制作?
var
png, pngsrc: TPngImage;
begin
png := TPngImage.CreateBlank(COLOR_RGBALPHA, 8, 32, 16);
pngsrc := TPngImage.Create;
try
pngsrc.LoadFromFile('c:\src.png');
pngsrc.Draw(png.Canvas, Rect(16, 0, 32, 16));
png.SaveToFile('c:\dst.png');
finally
png.Free;
pngsrc.Free;
end;
答案 0 :(得分:0)
按照以下代码,可以通过将Alpha数据作为一个单独的步骤传输,将具有透明度的PNG复制到更大的PNG图像中。
var
png, pngsrc: TPngImage;
X: Integer;
Y: Integer;
XOffset: Integer;
YOffset: Integer;
srcAlphaArray: pByteArray;
destAlphaArray: pByteArray;
begin
// Inspired by https://www.bverhue.nl/delphisvg/2016/09/26/save-bitmap-with-transparency-as-png-in-vcl/
// Optional X and Y offsets to position source png into destination png
XOffset := 16;
YOffset := 0;
png := TPngImage.CreateBlank(COLOR_RGBALPHA, 8, 32, 16);
png.CreateAlpha;
png.Canvas.CopyMode := cmSrcCopy;
pngsrc := TPngImage.Create;
try
pngsrc.LoadFromFile('c:\src.png');
pngsrc.Draw(png.Canvas, Rect(XOffset, YOffset, pngsrc.Width + XOffset, pngsrc.Height + YOffset));
if pngsrc.TransparencyMode = ptmPartial then
begin
// Update destination png with tranparency data from original
for Y := 0 to Pred(pngsrc.Height) do
begin
srcAlphaArray := pngsrc.AlphaScanline[Y];
destAlphaArray := png.AlphaScanline[Y + YOffset];
for X := 0 to Pred(pngsrc.Width) do
begin
destAlphaArray^[X + XOffset] := srcAlphaArray^[X];
end;
end;
end;
png.SaveToFile('c:\dst.png');
finally
png.Free;
pngsrc.Free;
end;
end;