TBitmap32.Assign () неправильное поведение - PullRequest
0 голосов
/ 27 декабря 2018

Что не так с 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 ошибка?Или я что-то не так делаю?Как это исправить?

Исходный файл overlay.png:
enter image description here

1 Ответ

0 голосов
/ 28 декабря 2018

Я думаю, что нашел решение.Я добавил пару строк в модуль 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.

...