Delphi,将一个PNG图像的内容复制到另一个不同大小的PNG图像

时间:2019-04-06 13:50:15

标签: delphi png

我想将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;

1 个答案:

答案 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;