gpt4 book ai didi

delphi - TBitmap32.Assign() 异常行为

转载 作者:行者123 更新时间:2023-12-01 16:36:13 27 4
gpt4 key购买 nike

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;

这是结果的屏幕截图:
enter image description here

这是一个 Graphics32 库(版本是来自 github 的最新版本)错误吗?或者 TWICImage 错误?还是Delphi 10.2.3的bug?或者我做错了什么?如何解决这个问题?

原始overlay.png文件:
enter image description here

最佳答案

我想我已经找到解决方案了。我在 GR32 模块中添加了几行到 TCustomBitmap32.Assign 过程的嵌套过程 AssignFromGraphic:

  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;

我添加了一些额外的检查并更改了过程AssignFromGraphicPlain(TargetBitmap: TCustomBitmap32; Src Graphic: TGraphic; FillColor: TColor32; ResetAlphaAfterDrawing: Boolean);的两个参数
使用 FillColor = $00FFFFFF(alpha channel = 0 的 clWhite32)和 ResetAlphaAfterDrawing = False,原始 PNG 图像的透明度现在被保留。这看起来像是一个肮脏的把戏,但它确实有效!
当然,我想听听更权威的意见,所以我暂时不会接受我的回答。可能还有另一种方法,无需更改 Graphics32 库的源代码。

关于delphi - TBitmap32.Assign() 异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53940231/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com