Delphi png组件:将32bpp bmp转换为png

Delphi png组件:将32bpp bmp转换为png,delphi,delphi-7,Delphi,Delphi 7,此代码适用于PngImage组件(来自G.Daud)。现在,在D7()的PngImage替换为PngComponents之后,它不会编译 函数Bmp32ToPng(bmp:TBitmap):TPngObject; 变量 x、 y:整数; src,dst:PngImage.pbyterarray; 开始 结果:=无; 如果bmp.pixelformatPF32位,则 出口 结果:=TPngObject.CreateBlank(COLOR_RGBALPHA,8,bmp.Width,bmp.Heigh

此代码适用于PngImage组件(来自G.Daud)。现在,在D7()的PngImage替换为PngComponents之后,它不会编译

函数Bmp32ToPng(bmp:TBitmap):TPngObject;
变量
x、 y:整数;
src,dst:PngImage.pbyterarray;
开始
结果:=无;
如果bmp.pixelformatPF32位,则
出口
结果:=TPngObject.CreateBlank(COLOR_RGBALPHA,8,bmp.Width,bmp.Height);
Result.Canvas.Draw(0,0,bmp);
对于y:=0到bmp.Height-1,请不要开始
src:=bmp.ScanLine[y];
dst:=结果。字母扫描线[y];
对于x:=0到bmp.Width-1 do
dst[x]:=src[x*4+3];
结束;
结束;
Createblank
方法在PngComponents中不存在。不能用简单的
创建
然后设置
宽度/高度
来替换它<代码>宽度/高度在PNG组件中为R/O


如何将32bpp BMP(例如,从shell32.dll获取)转换为PNG?

GraphicEx和PNG组件以及pngimage相互冲突。要解决这个问题:

1) 始终按特定顺序将它们放在uses子句中-first-GraphicEx或PngComponents,last-pngimage

2) 构建项目。仅在uses子句更改后运行(或编译)项目是不够的


PS)pngimage随PNGcomponent软件包一起安装,但此版本已过时

您是否尝试过
分配
?您可能正在使用PngComponents附带的pngimage.pas的不同版本。D2009+附带的PngImage版本实际上有一个CreateBank构造函数。@Uwe,是的,我使用CubicExplorer的D7版本。需要任何编写Bmp32ToPng程序的方法。它必须采用bmp(例如从shell32.dll中提取的TBitmap)并写入32bpppng@TLama,
Assign
提供黑色BG png。删除、重命名或移开png组件附带的pngimage.pas和pnglang.pas文件。
function Bmp32ToPng(bmp: TBitmap): TPngObject;
var
  x, y: integer;
  src, dst: PngImage.pByteArray;
begin
  Result:= nil;
  if bmp.PixelFormat<>pf32bit then
    Exit;

  Result:= TPngObject.CreateBlank(COLOR_RGBALPHA, 8, bmp.Width, bmp.Height);
  Result.Canvas.Draw(0, 0, bmp);
  for y:= 0 to bmp.Height-1 do begin
    src:= bmp.ScanLine[y];
    dst:= Result.AlphaScanLine[y];
    for x:= 0 to bmp.Width-1 do
      dst[x]:= src[x*4+3];
  end;
end;