3

此代码适用于PngImage组件(来自 G.Daud)。现在,在将 PngImage替换为 D7 的 PngComponents ( http://code.google.com/p/cubicexplorer/downloads/list )后,它不会编译。

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;

PngComponentsCreateblank中不存在该方法。它不能用简单的then 设置代替。是PngComponents中的 R/O 。CreateWidth/heightWidth/height

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

4

1 回答 1

1

GraphicEx 和 PngComponents 和 pngimage 有冲突。要解决它:

1) 始终按特定顺序将它们放在使用子句中 - 首先 - GraphicEx 或 PngComponents,最后 - pngimage。

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

PS) pngimage 安装了 PNGcomponent 包,但是这个版本已经过时了

于 2015-01-19T04:06:49.883 回答