Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Конвертация GIF в PNG с сохранением прозрачности и каналом альфа в Delphi

Delphi , Мультимедиа , Микрофон

При работе с графическими изображениями в Delphi может возникнуть необходимость конвертации GIF в PNG с сохранением прозрачности и каналом альфа. В этой статье мы рассмотрим, как это можно сделать, используя встроенные компоненты и процедуры Delphi.

Проблема

При конвертации GIF в PNG с помощью кода:

procedure TForm1.Button1Click(Sender: TObject);
var
  png: TPngImage;
  p : TPicture;
begin
  p := TPicture.Create;
  p.LoadFromFile('C:\temp\php.gif');
  png := TPngImage.CreateBlank(COLOR_RGB , 8, p.Width, p.Height);
  png.Canvas.Draw(0,0, p.Graphic);
  png.SaveToFile('C:\Windows\Temp\test.png');
end;

полученное изображение имеет черный фон, а не прозрачность, как в исходном GIF. Кроме того, канал альфа в результате не сохраняется.

Подтвержденный ответ

Чтобы сохранить прозрачность и канал альфа при конвертации GIF в PNG, можно воспользоваться процедурой ForceAlphaChannel, которая создает канал альфа для любого PNG-изображения на основе заданного прозрачного цвета.

procedure ForceAlphaChannel(Image: TPngImage; BitTransparency: Boolean; TransparentColor: TColor; Amount: Byte);
var
  Temp: TPngImage;
  x, y: Integer;
  Line: VCL.Imaging.PngImage.pByteArray;
  PixColor: TColor;
begin
  Temp := TPngImage.CreateBlank(COLOR_RGBALPHA, 8, Image.Width, Image.Height);
  try
    for y := 0 to Image.Height - 1 do
    begin
      Line := Temp.AlphaScanline[y];
      for x := 0 to Image.Width - 1 do
      begin
        PixColor := Image.Pixels[x, y];
        Temp.Pixels[x, y] := PixColor;
        if BitTransparency and (PixColor = TransparentColor) then Line^[x] := 0
        else Line^[x] := Amount;
      end;
    end;
    Image.Assign(Temp);
  finally
    Temp.Free;
  end;
end;

Далее, после рисования GIF-изображения на canvas PNG, вызываем процедуру ForceAlphaChannel, передавая ей полученное изображение, флаг битной прозрачности, цвет прозрачности и значение альфа-канала.

procedure TForm1.Button1Click(Sender: TObject);
var
  png: TPngImage;
  p : TPicture;
  TransparentColor: TColor;
begin
  p := TPicture.Create;
  p.LoadFromFile('C:\temp\php.gif');
  TransparentColor := clFuchsia; // Задайте свой цвет прозрачности
  png := TPngImage.CreateBlank(COLOR_RGB , 8, p.Width, p.Height);
  // Устанавливаем цвет фона PNG на тот же цвет, который будет использоваться для настройки прозрачности
  png.Canvas.Brush.Color := TransparentColor;
  png.Canvas.FillRect(rect(0, 0 , p.Width, p.Height));
  png.Canvas.Draw(0, 0, p.Graphic);
  ForceAlphaChannel(png, true, TransparentColor, 255);
  png.SaveToFile('C:\Windows\Temp\test.png');
end;

Теперь полученное PNG-изображение будет прозрачным, а канал альфа сохранится.

Альтернативный ответ

Если вы используете Delphi XE2 и выше, можно воспользоваться поддержкой GDI+ для конвертации GIF в PNG с сохранением прозрачности и канала альфа. Для этого создайте объект TGPImage, загрузите в него GIF-изображение и сохраните его в формате PNG с помощью метода Save.

uses
  Winapi.GDIPAPI,
  Winapi.GDIPOBJ,
  Winapi.GDIPUTIL;

procedure TForm8.Button1Click(Sender: TObject);
var
  encoderClsid: TGUID;
  stat: TStatus;
  IMG: TGPImage;
begin
  IMG := TGPImage.Create('C:\temp\transparent.gif');
  try
    GetEncoderClsid('image/png', encoderClsid);
    stat := IMG.Save('C:\temp\transparent.png', encoderClsid, nil);
  finally
    IMG.Free;
  end;
  if (stat = Ok) then
    Showmessage('Success');
end;

Заключение

В данной статье мы рассмотрели два способа конвертации GIF в PNG с сохранением прозрачности и канала альфа в Delphi: с помощью процедуры ForceAlphaChannel и с помощью поддержки GDI+ в более новых версиях Delphi. Выбор метода зависит от версии Delphi, которую вы используете, и ваших конкретных требований к конвертации изображений.

Создано по материалам из источника по ссылке.

Конвертация GIF в PNG с сохранением прозрачности и каналом альфа в Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Микрофон ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:31:43/0.0032398700714111/0