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文件:
最佳答案
我想我已经找到了解决方案。我在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);
的两个参数使用
FillColor = $00FFFFFF
(带有alpha通道= 0的clWhite32)和ResetAlphaAfterDrawing = False
现在可以保留原始PNG图像的透明度。它看起来像个肮脏的把戏,但它可以工作!当然,我想听听更权威的意见,所以我不会接受我的回答。可能有另一种方法,而不更改Graphics32库的源代码。