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

Улучшение Прозрачности Икон в HeidiSQL при Масштабировании для Высокого Разрешения Экрана

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

Вопрос пользователя связан с необходимостью адаптации приложения HeidiSQL для работы в режиме высокого разрешения экранов (high DPI). Это включает в себя масштабирование TImageList, содержащего множество икон в формате PNG с альфа-прозрачностью. Пользователь предоставил код, который выполняет масштабирование, но в результате этого теряется прозрачность икон, особенно заметно на границах.

Оригинальный код:

procedure ScaleImageList(const ImgList: TImageList; ScaleFactor: Real);
var
  i: Integer;
  Extracted, Scaled: Graphics.TBitmap;
  ImgListCopy: TImageList;
begin
  if ScaleFactor = 1 then
    Exit;
  // Создание копии оригинального списка изображений
  ImgListCopy := TImageList.Create(nil);
  ImgListCopy.ColorDepth := cd32Bit;
  ImgListCopy.DrawingStyle := dsTransparent;
  ImgListCopy.Clear;
  // Добавление изображений из исходного списка
  for i := 0 to ImgList.Count-1 do begin
    ImgListCopy.AddImage(ImgList, i);
  end;
  // Установка размера для соответствия коэффициенту масштабирования
  ImgList.SetSize(Round(ImgList.Width * ScaleFactor), Round(ImgList.Height * ScaleFactor));
  for i:= 0 to ImgListCopy.Count-1 do begin
    Extracted := Graphics.TBitmap.Create;
    ImgListCopy.GetBitmap(i, Extracted);
    Scaled := Graphics.TBitmap.Create;
    Scaled.Width := ImgList.Width;
    Scaled.Height := ImgList.Height;
    Scaled.Canvas.FillRect(Scaled.Canvas.ClipRect);
    GraphUtil.ScaleImage(Extracted, Scaled, ScaleFactor);
    ImgList.Add(Scaled, Scaled);
  end;
  ImgListCopy.Free;
end;

Подтвержденное решение:

Пользователь нашел решение, которое заключается в использовании вспомогательных функций для работы с PNG изображениями. В частности, была использована функция LoadPNGFromImageList для загрузки PNG изображения из TImageList в объект TPngImage, включая альфа-канал, и функция ResizePngImage для масштабирования изображения. Обе функции были адаптированы из кода компонента PNGDelphi, разработанного Густаво Даудом.

procedure ScaleImageList(const ImgList: TImageList; ScaleFactor: Real);
var
  ResizedImages: TImageList;
  i: Integer;
  BitmapCopy: Graphics.TBitmap;
  PngOrig: TPngImage;
  ResizedWidth: Integer;
begin
  // Увеличение размера списка изображений для режима высокого DPI
  if ScaleFactor = 1 then
    Exit;

  ResizedWidth := Round(imgList.Width * ScaleFactor);

  // Создание нового списка с увеличенными иконками
  ResizedImages := TImageList.Create(ImgList.Owner);
  ResizedImages.Width := ResizedWidth;
  ResizedImages.Height := ResizedWidth;
  ResizedImages.ColorDepth := ImgList.ColorDepth;
  ResizedImages.DrawingStyle := ImgList.DrawingStyle;
  ResizedImages.Clear;

  for i := 0 to ImgList.Count-1 do begin
    PngOrig := TPngImage.CreateBlank(COLOR_RGBALPHA, 8, ImgList.Width, ImgList.Height);
    LoadPNGFromImageList(ImgList, i, PngOrig);
    ResizePngImage(PngOrig, ResizedWidth, ResizedWidth);
    BitmapCopy := Graphics.TBitmap.Create;
    PngOrig.AssignTo(BitmapCopy);
    BitmapCopy.AlphaFormat := afIgnored;
    ImageList_Add(ResizedImages.Handle, BitmapCopy.Handle, 0);
  end;

  // Присваивание изображений оригинальному экземпляру
  ImgList.Assign(ResizedImages);
end;

Важные замечания:

  • Необходимо обратить внимание на утечки памяти в коде. Создание объектов TPNGImage и BitmapCopy внутри цикла может привести к проблемам с производительностью и памятью. Лучше создать их за пределами цикла и освободить после его выполнения.
  • Функция ImageList_Add используется для добавления изображений в TImageList и находится в модуле Winapi.CommCtrl.

Заключение:

Масштабирование икон в формате PNG с альфа-прозрачностью для высокого разрешения экрана может быть выполнено с помощью специализированных функций, таких как LoadPNGFromImageList и ResizePngImage. Важно следить за управлением ресурсами и избегать утечек памяти в процессе работы с изображениями.

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

Вопрос связан с улучшением прозрачности икон в приложении HeidiSQL при их масштабировании для работы на экранах с высоким разрешением.


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

Получайте свежие новости и обновления по 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 11:23:36/0.0035209655761719/0