Пожалуй, это самый простой способ создания прозрачного изображения. Суть его в том, что маска создается автоматически во время выполнения программы, используя значение прозрачного цвета.
MaskBitmap := TBitmap.Create;
MaskBitmap.Assign(SrcBitmap);
MaskBitmap.Mask(FColor); //прозрачный цвет
BitBlt(DestBitmap.Canvas.Handle, x, y,
SrcBitmap.Width, SrcBitmap.Height,
MaskBitmap.Canvas.Handle, 0, 0, SRCAND);
BitBlt(DestBitmap.Canvas.Handle, x, y,
SrcBitmap.Width, SrcBitmap.Height,
SrcBitmap.Canvas.Handle, 0, 0, SRCINVERT);
MaskBitmap.Free;
Here's a translation of the provided text into Russian:
Код-сниппет является частью программы, которая создает прозрачную картинку, применявая маску к оригинальной картинке. Маска генерируется автоматически в реальном времени с использованием значения прозрачного цвета.
Вот разбивка на шаги, что каждый раздел делает:
MaskBitmap := TBitmap.Create; - Создается новый экземпляр класса TBitmap, который представляет собой изображение bitmap.
MaskBitmap.Assign(SrcBitmap); - Присваивается значение SrcBitmap (оригинальной картинки) к MaskBitmap.
MaskBitmap.Mask(FColor); - Устанавливается маска MaskBitmap в прозрачный цвет, указанный в FColor. Это создаст маску, где пиксели с тем же цветом, как FColor, будут установлены в 0 (прозрачные).
Далее два следующих шага выполняют операции BitBlt, которые копируют части одной картинки в другую. Эти операции используют маску, созданную на шаге 3:
BitBlt(DestBitmap.Canvas.Handle, x, y, ...); - Копирует часть SrcBitmap в DestBitmap, используя маску, генерируемую ранее. Флаг SRCAND означает, что только пиксели, где соответствующий пиксель в маске не прозрачен (т.е., имеет значение больше 0), будут скопированы.
BitBlt(DestBitmap.Canvas.Handle, x, y, ...); - Копирует другую часть SrcBitmap в DestBitmap, используя ту же маску. Флаг SRCINVERT означает, что пиксели, где соответствующий пиксель в маске прозрачен (т.е., имеет значение 0), будут инвертированы (т.е., сделаны прозрачными).
Наконец:
MaskBitmap.Free; - Освобождается память, выделенная для MaskBitmap.
Результатом должно быть изображение (DestBitmap), которое теперь имеет прозрачный фон.
Возможной альтернативой может быть использование alpha- blending, что позволит создавать прозрачную маску без использования операций BitBlt. Alpha-blending поддерживается многими библиотеками и фреймворками, включая библиотеку Graphics32 Delphi. Вот пример, как это можно сделать с помощью Graphics32:
uses ..., Graphics32;
...
var
DestBitmap: TBitmap32;
SrcBitmap: TBitmap32;
MaskColor: TColor;
begin
// Создаем битмапы и устанавливаем цвет маски
DestBitmap := TBitmap32.Create;
SrcBitmap := TBitmap32.Create;
MaskColor := clWhite; // Замените на ваш желаемый прозрачный цвет
// Копируем исходную картинку в целевую картинку, применяя маску
AlphaBlend(DestBitmap.Canvas, x, y, SrcBitmap.Width, SrcBitmap.Height,
SrcBitmap.Canvas, 0, 0, SrcBitmap.Width, SrcBitmap.Height,
MaskColor, 128);
// Освобождаем битмапы
DestBitmap.Free;
SrcBitmap.Free;
end.
В этом примере используется AlphaBlend для смешивания SrcBitmap с DestBitmap, используя указанную MaskColor как маску. Цвет маски должен быть заменен на ваш желаемый прозрачный цвет.
Прозрачный растр создается автоматически во время выполнения программы с помощью значения прозрачного цвета, используя функцию BitBlt и класс TBitmap.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS