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;

このCreateblankメソッドはPngComponentsに存在しません。Create単純なthen 設定に置き換えることはできませんWidth/heightWidth/heightPngComponentsの R/O です。

32bpp BMP (例: shell32.dll から取得) を PNG に変換するには?

4

1 に答える 1

1

GraphicEx と PngComponents と pngimage が競合しています。それを解決するには:

1) 常に特定の順序で uses 句に入れます - 最初 - GraphicEx または PngComponents、最後 - pngimage。

2) プロジェクトをビルドします。uses 句が変更された後にプロジェクトを実行 (またはコンパイル) するだけでは不十分です。

PS) PNGcomponent パッケージでインストールされた pngimage ですが、このバージョンは古くなっています

于 2015-01-19T04:06:49.883 に答える