delphi - TBitmap32.Assign() 异常行为
问题描述
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 的错误?还是我做错了什么?如何解决这个问题?
解决方案
我想我找到了解决办法。GR32
我在模块的嵌套过程AssignFromGraphic
中添加了几行TCustomBitmap32.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 FillColor = $00FFFFFF
(clWhite32 with alpha channel = 0)的两个参数,ResetAlphaAfterDrawing = False
现在保留了原始 PNG 图像的透明度。这看起来像一个肮脏的把戏,但它有效!
当然,我想听听更权威的意见,所以我暂时不会接受我的回答。在不改变 Graphics32 库的源代码的情况下,可能还有另一种方法。
推荐阅读
- powerbi - Power BI DAX 迭代器函数转义上下文
- google-bigquery - 如何在 BigQuery 中按几何顺序生成行?
- c++ - 为什么 operator<< 不会将我的客户类对象隐式转换为字符串
- linux - 在 Docker 文件中使用 pip 安装 aws cli
- javascript - MouseEvent('click') 触发,而 Event('click') 不触发
- xamarin - 禁用滑动视图不处理内容上的点击手势事件
- assembly - 零扩展立即值以适合寄存器
- c# - Roslyn:将 using 语句添加到语法树
- python - Python pandas如何将df:列值转换为行值?
- c++ - A类中的B类继承A类