2

Graphics32 TBitmap32.Assign() の何が問題になっていますか? 元の画像の透明度が TBitmap32 では保持されないのに、TBitmap ではすべて問題ないのはなぜですか? サンプルコードは次のとおりです。

procedure TForm1.Button8Click(Sender: TObject);
var
  bmp32: TBitmap32;
  bmp: TBitmap;
  wic: TWICImage;
begin
  bmp32 := TBitmap32.Create(TMemoryBackend);
  bmp := TBitmap.Create;
  wic := TWICImage.Create;
  try
    wic.LoadFromFile('overlay.png'); // transparent
    bmp32.Assign(wic);
    bmp32.SaveToFile('BMP32.bmp'); // !!! nontransparent .bmp
    img1.Bitmap.Assign(bmp32);
    bmp.Assign(wic);
    bmp.SaveToFile('BMP.bmp'); // transparent .bmp
    img2.Bitmap.Assign(bmp);
  finally
    wic.Free;
    bmp32.Free;
    bmp.Free;
  end;
end;

結果のスクリーンショットを次に示します。
ここに画像の説明を入力

これは Graphics32 ライブラリ (バージョンは github の最新版) のバグですか? それともTWICImageのバグ?それとも Delphi 10.2.3 のバグですか? それとも私は何か間違ったことをしていますか?これを修正する方法は?

元の overlay.png ファイル:
ここに画像の説明を入力

4

1 に答える 1

1

私は解決策を見つけたと思います。プロシージャのGR32ネストされたプロシージャにモジュールに数行を追加しました。 AssignFromGraphicTCustomBitmap32.Assign

  procedure AssignFromGraphic(TargetBitmap: TCustomBitmap32; SrcGraphic: TGraphic);
  begin
    if SrcGraphic is TBitmap then
      AssignFromBitmap(TargetBitmap, TBitmap(SrcGraphic))
    else if SrcGraphic is TIcon then
      AssignFromIcon(TargetBitmap, TIcon(SrcGraphic))
{$IFNDEF PLATFORM_INDEPENDENT}
    else if SrcGraphic is TMetaFile then
      AssignFromGraphicMasked(TargetBitmap, SrcGraphic)
{$ENDIF}
//--- start fix
    else if (SrcGraphic is TWICImage) and (TWICImage(SrcGraphic).ImageFormat = wifPng) then
      AssignFromGraphicPlain(TargetBitmap, SrcGraphic, $00FFFFFF, False)
//--- end fix
    else
      AssignFromGraphicPlain(TargetBitmap, SrcGraphic, clWhite32, True);
  end;

追加のチェックを追加し、procedure AssignFromGraphicPlain(TargetBitmap: TCustomBitmap32; Src Graphic: TGraphic; FillColor: TColor32; ResetAlphaAfterDrawing: Boolean);
Withの 2 つのパラメーターを変更しましたFillColor = $00FFFFFF(アルファ チャネル = 0 の clWhite32) ResetAlphaAfterDrawing = False。元の PNG 画像の透明度が保持されるようになりました。汚いトリックのように見えますが、うまくいきます!
もちろん、もっと権威ある意見を聞きたいので、私の回答はまだ受け入れません。Graphics32 ライブラリのソース コードを変更しない別の方法があるかもしれません。

于 2018-12-28T12:27:04.063 に答える