【问题标题】:TBitmap32.Assign() abnormal behaviorTBitmap32.Assign() 异常行为
【发布时间】:2019-05-25 04:46:26
【问题描述】:

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文件:

【问题讨论】:

标签: delphi delphi-10.2-tokyo alpha-transparency graphics32


【解决方案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); 的两个参数
使用FillColor = $00FFFFFF (clWhite32 with alpha channel = 0) 和ResetAlphaAfterDrawing = False,现在保留了原始 PNG 图像的透明度。这看起来像一个肮脏的把戏,但它确实有效!
当然,我想听听更权威的意见,所以我暂时不接受我的回答。在不改变Graphics32库的源代码的情况下,可能还有另一种方式。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 2017-01-22
  • 2013-04-14
  • 2014-01-29
  • 1970-01-01
相关资源
最近更新 更多