Вопрос пользователя связан с необходимостью адаптации приложения 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.