[英]Delphi, copy content of a PNG image to another PNG image of different size
我想將 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;
將具有透明度的 PNG 復制到更大的 PNG 圖像可以通過將 alpha 數據作為單獨的步驟傳輸來實現,如以下代碼所示。
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.