Delphi, скопируйте содержимое изображения PNG в другое изображение PNG другого размера - PullRequest
1 голос
/ 06 апреля 2019

Я хочу скопировать содержимое 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 голосов
/ 24 мая 2019

Копирование 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...