PNG теряет прозрачность при конвертации из растрового изображения - PullRequest
0 голосов
/ 11 февраля 2020

Я загружаю 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 to True:

enter image description here

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

enter image description here

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

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

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

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

0 голосов
/ 12 февраля 2020

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

Bmp.Assign(PngImage);

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

PngImage2.Assign(Bmp);

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

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

https://github.com/graphics32/GR32PNG

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...