Приветствую! В данном запросе рассматривается задача инвертирования изображений, которые уже находятся в коллекции TImageCollection, при этом необходимо сохранить их прозрачность. Это часто требуется для отображения иконов на тёмных фонах.
Решение задачи
Исходный код, предоставленный пользователем Alister, решает задачу инвертирования изображений в коллекции TImageCollection с использованием следующих шагов:
Итерация по всем изображениям в коллекции.
Создание битмапа для каждого изображения из коллекции.
Применение функции преобразования к каждому пикселю, изменяя его цвет на противоположный (например, чёрный на белый).
Преобразование альфа-канала с помощью функции PremultiplyAlpha для корректного отображения цвета.
uses
System.UITypes,
System.UIConsts;
procedure TdmImages.ConvertAllToColor(const color: TColor);
var
i: Integer;
bmp: TBitmap;
begin
for i := 0 to ImageCollection.Count -1 do
begin
var image := ImageCollection.Images[i].SourceImages[0].Image;
bmp := TBitmap.Create;
bmp.Assign(image);
GiveColorToBitmap(bmp, color);
image.Assign(bmp);
bmp.Free;
end;
end;
function GetAValue(Color: TAlphaColor): Byte;
begin
Result := Byte(Color shr 24);
end;
procedure TdmImages.GiveColorToBitmap(const bmp: TBitmap; const color: TColor);
var
x, y: Integer;
line: PAlphaColorArray;
Pixel, newPixel: TAlphaColor;
R, G, B, A: Byte;
begin
R := GetRValue(color);
G := GetGValue(color);
B := GetBValue(color);
for y := 0 to bmp.Height-1 do
begin
line := bmp.ScanLine[y];
for x := 0 to bmp.Width-1 do
begin
Pixel := line[x];
A := GetAValue(Pixel);
if (A <> 0) then { если пиксель не полностью прозрачен }
begin
// Инвертируем цвета, сохраняя альфа-канал
newPixel := ColorInvert(RGB(B, G, R)) + (A shl 24);
line[x] := PremultiplyAlpha(newPixel);
end;
end;
end;
end;
// Функция для инвертирования цвета без учёта альфа-канала
function ColorInvert(const color: TColor): TColor;
begin
Result := $FFFFFF - color; // Инвертируем цвет, предполагая что белый это $FFFFFF
end;
Альтернативное решение
В качестве альтернативного решения можно было бы использовать внешнюю библиотеку для работы с изображениями, например, ImageMagick или GDIP (Graphics Drawing Interface Plus), которые предоставляют более широкие возможности по манипулированию изображениями. Однако это может быть избыточным и увеличить размер приложения.
Итог
Использование предложенного выше кода позволяет инвертировать цвета изображений в TImageCollection, сохраняя при этом прозрачность. Это решение подходит для динамического изменения темы интерфейса без необходимости хранить отдельные коллекции изображений для каждой цветовой схемы.
Это основные моменты, которые стоит учесть при инвертировании изображений с прозрачностью в Delphi. Если у вас возникнут дополнительные вопросы по данной теме или потребуется помощь с другими задачами, связанными с разработкой на Delphi, не стесняйтесь обращаться!
Инверсия изображений из коллекции `TImageCollection` с сохранением прозрачности для отображения на тёмных фонах.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.