PNG теряет прозрачность при конвертации из растрового изображения

Я загружаю png-файл в TPNGImage, а затем отображаю его в TImage. Нет проблем. Затем я создаю TBitmap, назначаю его TPNGImage и отображаю в TImage. Нет проблем.

Затем я создаю второй TPNGImage и назначаю его TBitmap. В этом случае, если я отображаю его в TImage, он потерял прозрачность. Если для TBitmap.Transparent установить значение True, перед назначением PNGImage изображение PNGI будет в основном прозрачным, но есть небольшая область, где прозрачность была потеряна, и отображается черным цветом.

var
  Bmp: TBitmap;
  PngImage: TPNGImage;
  PngImage2: TPNGImage;
begin
  PngImage := TPNGImage.Create;
  try
    PngImage.LoadFromFile(FILE_NAME);
    Image1.Picture.Assign(PngImage);

    Bmp := TBitmap.Create;
    try
      Bmp.Assign(PngImage);
      Image2.Picture.Assign(Bmp);

      PngImage2 := TPNGImage.Create;
      try
        //Bmp.Transparent := True;
        PngImage2.Assign(Bmp);
        Image3.Picture.Assign(PngImage2);
      finally
        PngImage2.Free;
      end;
    finally
      Bmp.Free;
    end;
  finally
    PngImage.Free;
  end;
end;

Результат без установки Bitmap.Transparent на True:

введите описание изображения здесь

Результат, когда я установил для параметра Bitmap.Transparent значение True: на изображении есть немного черного цвета

введите описание изображения здесь

Как я могу назначить PNGImage для растрового изображения без потери прозрачности?

Всего 2 ответа


Я могу только строить догадки ... Но PNG поддерживают частичную прозрачность, а 24-битные растровые изображения - нет. А поскольку оставшиеся «черные» пиксели не являются черными (они стоят $ 000101), я подозреваю, что эти пиксели полупрозрачны в исходном png. Это или какой-то сглаживающий эффект был применен при преобразовании в растровое изображение. Но я считаю, что полупрозрачность более вероятна.

Я никогда не работал с 32-битными растровыми изображениями, но, возможно, их можно использовать для сохранения прозрачности. (У них есть альфа-канал ...). Но я подозреваю, что это может быть сложнее, чем просто Bitmap.Assign.


Я могу подтвердить, что @SertacAkyuz сказал в комментариях. Нет проблем с:

Bmp.Assign(PngImage);

В результате получается 32-битное изображение, которое сохраняет альфа-канал. Проблема с

PngImage2.Assign(Bmp);

Где альфа потеряна.

Я нашел эту библиотеку, чтобы помочь с преобразованием:

https://github.com/graphics32/GR32PNG


Есть идеи?

10000