При работе с компонентом TImage в среде разработки Delphi часто возникает необходимость сделать изображение полупрозрачным, чтобы можно было видеть, что находится под ним. В данной статье мы рассмотрим, как изменить уровень прозрачности изображения, используя возможности Object Pascal.
Проблема
На форме у нас есть два компонента TImage, и верхний из них должен быть полупрозрачным, чтобы можно было увидеть элементы, расположенные под ним.
Решение
Для создания полупрозрачного эффекта TImage сам по себе не подходит для альфа-смешивания с другими элементами интерфейса. Однако можно отобразить альфа-смешанное GIF-изображение внутри TImage, используя класс TGIFImage. Но есть более универсальный способ, который заключается в использовании 32-битного битового изображения с поддержкой прозрачности.
Пример кода
Ниже приведен пример кода, который позволяет установить уровень прозрачности для изображения, используя альфа-канал битового изображения:
type
pRGBQuadArray = ^TRGBQuadArray;
TRGBQuadArray = ARRAY [0 .. 0] OF TRGBQuad;
procedure SetImageAlpha(Image: TImage; Alpha: Byte);
var
pscanLine32, pscanLine32_src: pRGBQuadArray;
nScanLineCount, nPixelCount: Integer;
BMP1, BMP2: TBitMap;
WasBitMap: Boolean;
begin
if Assigned(Image.Picture) then
begin
WasBitMap := Not Assigned(Image.Picture.Graphic);
if not WasBitMap then
begin
BMP1 := TBitMap.Create;
BMP1.Assign(Image.Picture.Graphic);
end
else
BMP1 := Image.Picture.Bitmap;
BMP1.PixelFormat := pf32Bit;
BMP2 := TBitMap.Create;
BMP2.Assign(BMP1);
BMP1.AlphaFormat := afDefined;
end;
for nScanLineCount := 0 to BMP1.Height - 1 do
begin
pscanLine32 := BMP1.ScanLine[nScanLineCount];
pscanLine32_src := BMP2.ScanLine[nScanLineCount];
for nPixelCount := 0 to BMP1.Width - 1 do
begin
pscanLine32[nPixelCount].rgbReserved := Alpha;
pscanLine32[nPixelCount].rgbBlue := pscanLine32_src[nPixelCount].rgbBlue;
pscanLine32[nPixelCount].rgbRed := pscanLine32_src[nPixelCount].rgbRed;
pscanLine32[nPixelCount].rgbGreen := pscanLine32_src[nPixelCount].rgbGreen;
end;
end;
if not WasBitMap then
begin
Image.Picture.Assign(BMP1);
BMP1.Free;
end;
BMP2.Free;
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
SetImageAlpha(Image1, 200);
SetImageAlpha(Image2, 128);
SetImageAlpha(Image3, 80);
end;
Использование кода
Создаем несколько процедур, где SetImageAlpha изменяет прозрачность для каждого TImage:
SetImageAlpha(Image1,255); // Полностью прозрачен для отображения нижнего слоя
SetImageAlpha(Image2,192); // Более темный прозрачный слой, чем 255, но все еще видит под собой
SetImageAlpha(Image3,128); // Обычно используемый базовый уровень прозрачности для 50% видимости
Важно
Учтите, что перезапись альфа-канала приведет к потере пиксельной информации, если не создавать копию изображения перед изменением альфа-формата.
Примечание
Необходимо обратить внимание, что TWinControls не могут быть перекрыты, и использование альфа-прозрачности применимо только к 32-битным изображениям.
Таким образом, используя представленный код, вы сможете настроить уровень прозрачности для изображений в компоненте TImage, что позволит создавать сложные и привлекательные интерфейсы в приложениях, написанных на Delphi.
В данном контексте описывается процесс создания полупрозрачных изображений с помощью компонента `TImage` в среде разработки Delphi, используя Object Pascal для изменения уровня прозрачности.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.