簡體   English   中英

Delphi,將一個PNG圖片的內容復制到另一個不同大小的PNG圖片

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM