delphi PNG到TBitmap(保持透明度)

l7wslrjt  于 2023-05-22  发布在  其他
关注(0)|答案(3)|浏览(315)

我使用 Delphi 10.3.3 VCL。
我想加载一个PNG图像,转换为TBitmap(为了进行一些修改),然后将其保存为PNG。
我使用这个代码,但它失去了透明度。透明背景变为黑色。

var
  InputPNG: TPngImage;
  OutputPNG: TPngImage;
  BMP: TBitmap;
begin
  InputPNG  := TPngImage.Create;
  OutputPNG := TPngImage.Create;
  BMP := TBitmap.Create;

  InputPNG.LoadFromFile('C:\input.png');
  BMP.Assign(InputPNG);

  OutputPNG.Assign(BMP);
  OutputPNG.SaveToFile('C:\output.png');

  InputPNG.Free;
  OutputPNG.Free;
  BMP.Free;
end;

如何修改代码并保持PNG透明?欢迎任何带有免费组件的解决方案,如Skia4Delphi。

6ie5vjzr

6ie5vjzr1#

使用TWICImage保存到文件。这将保留alpha通道:

procedure SaveToPng(aBmp: TBitmap; const Filename: string);
var
  wic: TWICImage;
begin
  Assert(aBmp.PixelFormat=pf32bit);
  wic := TWICImage.Create;
  try
    aBmp.AlphaFormat := afDefined;
    wic.Assign(aBmp);
    wic.ImageFormat := wifPng;
    wic.SaveToFile(Filename);
  finally
    wic.Free;
  end;
end;

请注意,每当您使用VCL.Graphics将png分配给bmp时,位图将具有Alphaformat = afDefined,这意味着RGB通道乘以alpha。如果你现在修改位图的字母通道,这可能会导致意想不到的结果。我总是在做任何修改之前设置bmp.Alphaformat:=afIgnored。

elcex8rz

elcex8rz2#

尝试在分配PNG图像之前添加这些行。

BMP.PixelFormat := pf32bit; // not sure if this is necessary
  BMP.Transparent := True;
  BMP.Assign(iPNG);
iyzzxitl

iyzzxitl3#

使用以下代码:

InputPNG.AssignTo(BMP);

相关问题