Я думаю, что нашел решение.Я добавил пару строк в модуль 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
(clWhite32 с альфа-каналом = 0) и ResetAlphaAfterDrawing = False
прозрачность исходного изображения PNG теперь сохраняется.Это похоже на подвох, но это работает!
Конечно, я хотел бы услышать более авторитетное мнение, поэтому я пока не приму мой ответ.Может быть другой способ без изменения исходного кода библиотеки Graphics32.