Сохранение растрового изображения с прозрачностью в PNG в Delphi 2007

У меня есть растровое изображение Delphi (32 бит), в котором есть информация о прозрачности. Мне нужно преобразовать и сохранить его в файл PNG с сохранением прозрачности.

В настоящее время у меня есть инструменты: библиотека graphics32, GR32_PNG (от Christian Budde) и PNGImage (от Gustavo daud).

Как лучше всего это сделать?

РЕДАКТИРОВАТЬ 1: В моем растровом изображении не только один прозрачный цвет, но и пиксели с разными уровнями прозрачности, которые необходимо сохранить.

РЕДАКТИРОВАТЬ 2: я получаю свое растровое изображение с альфа-информацией, устанавливая фон изображения в PNG, который у меня есть только с пустым альфа-слоем. Затем я пишу на нем текст со сглаживанием. Затем я сохраняю растровое изображение. При открытии с помощью gimp он показывает прозрачность, а при увеличении вы можете увидеть эффект сглаживания.


person Tim    schedule 12.01.2011    source источник


Ответы (3)


Используйте PNGImage. В Delphi попробуйте следующее:

function ConvertToPNG(oBMPSrc: TBitmap; sFilename: String);
var
  oPNGDest: TPNGObject;
begin
  oPNGDest := TPNGObject.Create;
  try
    oPNGDest.Assign(oBMPSrc);
    oPNGDest.SaveToFile(sFilename); 
  finally
    oPNGDest.Free;
  end;
end;

Если это не сработает для вас, вам, вероятно, придется копировать значения альфа и RGB по отдельности.

function ConvertToPNG(oBMPSrc: TBitmap; sFilename: String);
var
  oPNGDest: TPNGObject;
begin
  oPNGDest := TPNGObject.CreateBlank(COLOR_RGBALPHA, 8, oBMPSrc.Width, oBMPSrc.Height);
  try
    oPNGDest.CreateAlpha;
    // Copy over RGB
    ..
    // Copy over Alpha
    ..
    // Save to file
    oPNGDest.SaveToFile(sFilename); 
  finally
    oPNGDest.Free;
  end;
end;
person Marcus Adams    schedule 12.01.2011
comment
Если я включу модуль PNGImage в свою программу, сохраненное растровое изображение, которое я создал (отметьте EDIT 2 в основном вопросе), больше не будет отображать информацию о прозрачности. - person Tim; 12.01.2011

Я не мог заставить работать ни один из двух других ответов. Они могут работать на других, но вот что я сделал.

  1. Я создал растровое изображение с прозрачностью.
  2. Назначил его TBitmap32 из библиотеки Graphics 32.
  3. Назначил его TPortableNetworkGraphics32 от Christian Budde's GR32_PNG для Graphics32
  4. Вызывается методом TPortableNetworkGraphics32.SaveToFile.
person Tim    schedule 13.01.2011

Просмотрите эту ссылку

Есть функция:

function WriteBitmapToPngFile( Filename : string; Bitmap : TBitmap; TransparentColor:TColor):boolean;
person M Schenkel    schedule 12.01.2011
comment
Глядя на код функции, кажется, что она делает прозрачным только 1 цвет вместо различных уровней, которые мне нужны. (обновили вопрос, чтобы прояснить это). Однако я все же попробовал, создав PNGUnit и PNGLib по предоставленной ссылке. При вызове функции программа запускается, но закрывается еще до того, как покажет основную форму, без сообщения об ошибке. Спасибо за вашу помощь. - person Tim; 12.01.2011