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

Решение проблемы с плавным переходом изображений PNG в Delphi 2006

Delphi , Компоненты и Классы , TImage и TImageList

Пользователи, работающие с Delphi 2006, могут столкнуться с проблемой плавного перехода прозрачности (fade) изображений в формате PNG. Это может быть связано с особенностями обработки альфа-канала в данной версии среды разработки. В данной статье мы рассмотрим, как решить эту проблему, используя примеры кода на Object Pascal.

Проблема

При попытке плавно изменить прозрачность PNG-изображения в Delphi 2006, пользователи могут столкнуться с тем, что полный диапазон прозрачности не доступен, а прозрачные участки изображения отображаются в виде белого цвета.

Пример кода, вызывающего проблему

Код, представленный ниже, предназначен для плавного изменения прозрачности PNG-изображения, но в Delphi 2006 не работает должным образом:

procedure TAlphaBlendForm.PaintBox1Paint(Sender: TObject);
var
  fn: TBlendFunction;
begin
  fn.BlendOp := AC_SRC_OVER;
  fn.BlendFlags := 0;
  fn.SourceConstantAlpha := FOpacity;
  fn.AlphaFormat := AC_SRC_ALPHA;
  Windows.AlphaBlend(
    PaintBox1.Canvas.Handle,
    0,
    0,
    PaintBox1.Width,
    PaintBox1.Height,
    FBitmap.Canvas.Handle,
    0,
    0,
    FBitmap.Width,
    FBitmap.Height,
    fn
  );
end;

Решение проблемы

Проблема заключается в том, что информация об альфа-канале теряется при назначении графики битмапу. Поэтому нет смысла устанавливать формат пикселей в pf32bit после назначения, так как в битмапе все равно нет альфа-канала на уровне отдельных пикселей.

Однако объект PNG знает, как рисовать на холсте, учитывая информацию о прозрачности. Следовательно, решение заключается в рисовании на холсте битмапа вместо назначения графики, и затем, учитывая отсутствие альфа-канала, необходимо убрать флаг AC_SRC_ALPHA из структуры BLENDFUNCTION.

Рабочий код

Вот пример рабочего кода на Delphi 2007, который решает проблему:

procedure TAlphaBlendForm.FormCreate(Sender: TObject);
begin
  Image1.Picture.LoadFromFile(
    ExtractFilePath(Application.ExeName) + 'Icon_attention_s.png'
  );
  FBitmap := TBitmap.Create;
  FBitmap.Width := Image1.Picture.Graphic.Width;
  FBitmap.Height := Image1.Picture.Graphic.Height;
  FBitmap.Canvas.Brush.Color := Color;      // Цвет фона для изображения
  FBitmap.Canvas.FillRect(FBitmap.Canvas.ClipRect);
  FBitmap.Canvas.Draw(0, 0, Image1.Picture.Graphic);
  PaintBox1.Width := FBitmap.Width;
  PaintBox1.Height := FBitmap.Height;
end;

procedure TAlphaBlendForm.PaintBox1Paint(Sender: TObject);
var
  fn: TBlendFunction;
begin
  fn.BlendOp := AC_SRC_OVER;
  fn.BlendFlags := 0;
  fn.SourceConstantAlpha := FOpacity;
  fn.AlphaFormat := 0; // Убираем флаг AC_SRC_ALPHA
  Windows.AlphaBlend(
    PaintBox1.Canvas.Handle,
    0,
    0,
    PaintBox1.Width,
    PaintBox1.Height,
    FBitmap.Canvas.Handle,
    0,
    0,
    FBitmap.Width,
    FBitmap.Height,
    fn
  );
end;

Или без использования промежуточного TImage:

procedure TAlphaBlendForm.FormCreate(Sender: TObject);
var
  PNG: TPNGObject;
begin
  PNG := TPNGObject.Create;
  try
    PNG.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Icon_attention_s.png');
    FBitmap := TBitmap.Create;
    FBitmap.Width := PNG.Width;
    FBitmap.Height := PNG.Height;
    FBitmap.Canvas.Brush.Color := Color;
    FBitmap.Canvas.FillRect(FBitmap.Canvas.ClipRect);
    PNG.Draw(FBitmap.Canvas, FBitmap.Canvas.ClipRect);
    PaintBox1.Width := FBitmap.Width;
    PaintBox1.Height := FBitmap.Height;
  finally
    PNG.Free;
  end;
end;

Заключение

Используя приведенный выше код, разработчики могут успешно решить проблему с плавным изменением прозрачности PNG-изображений в Delphi 2006. Обратите внимание, что для работы с PNG-изображениями и их прозрачностью могут потребоваться дополнительные компоненты и библиотеки, которые поддерживают работу с альфа-каналом.

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

Пользователи Delphi 2006 сталкиваются с проблемой плавного перехода прозрачности изображений PNG, и в этой статье рассматривается решение данной проблемы через код на Object Pascal.


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

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




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


:: Главная :: TImage и TImageList ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 03:30:06/0.0079531669616699/0