![]() |
![]() ![]() ![]() ![]() |
|
Установка уровня прозрачности изображенияDelphi , Графика и Игры , Bitmap
Автор: Fenik
{ **** UBPFD *********** by delphibase.endimus.com ****
>>
Зависимости: Windows, Graphics, Math
Автор: Fenik, chook_nu@uraltc.ru, Новоуральск
Copyright: Автор Федоровских Николай
Дата: 3 сентября 2002 г.
***************************************************** }
procedure BlendBitmap(Src, Dest: TBitmap; Amount: Byte; Left, Top:
Integer; BackColor: TColor; Transparent: Boolean);
function CandC(C1, C2: TRGBTriple): Boolean;
begin {Сравнение двух цветов}
Result := (C1.rgbtBlue = C2.rgbtBlue) and
(C1.rgbtGreen = C2.rgbtGreen) and
(C1.rgbtRed = C2.rgbtRed);
end;
{Процедура установления уровня прозрачности
изображения Dest, расположенного над изображением Src.
Amount - уровень прозрачности в промежутке [0..255].
Left, Top - левый верхний угол Dest.
BackColor - цвет, который не нужно изменять,
если Transparent = True.}
var
x, y, y1, y2, x1, x2: Integer;
ps, pd: pRGBTriple;
rgb: TRGBTriple;
A1, A2: Double;
begin
Src.PixelFormat := pf24Bit;
Dest.PixelFormat := pf24Bit;
A1 := Amount / 255;
A2 := 1 - A1;
{Изменяется только та часть изображения,
которая расположена над исходным}
y1 := Max(0, Top);
x1 := Max(0, Left);
x2 := Min(Src.Width - 1, Left + Dest.Width - 1);
y2 := Min(Src.Height - 1, Top + Dest.Height - 1);
rgb.rgbtRed := Lo(BackColor);
rgb.rgbtGreen := Lo(BackColor shr 8);
rgb.rgbtBlue := Lo((BackColor shr 8) shr 8);
for y := y1 to y2 do
begin
ps := Src.ScanLine[y];
pd := Dest.ScanLine[y - Top];
Inc(ps, x1);
if Left < 0 then
Inc(pd, Abs(Left));
for x := x1 to x2 do
begin
if not (Transparent and CandC(pd^, rgb)) then
with pd^ do
begin
rgbtBlue := Round(A1 * ps^.rgbtBlue + A2 * rgbtBlue);
rgbtGreen := Round(A1 * ps^.rgbtGreen + A2 * rgbtGreen);
rgbtRed := Round(A1 * ps^.rgbtRed + A2 * rgbtRed);
end;
Inc(pd);
Inc(ps);
end;
end;
end;
Пример использования:
var
Bmp: TBitmap;
begin
if not FileExists('C:\Blend.bmp') then
Exit;
Bmp := TBitmap.Create;
try
Bmp.LoadFromFile('C:\Blend.bmp');
BlendBitmap(FBitmap, Bmp, 127, 10, 10, clWhite, True);
Bmp.TransparentColor := clWhite;
Bmp.Transparent := True;
FBitmap.Canvas.Draw(10, 10, Bmp);
finally
Bmp.Free;
end;
Paint;
end;
Программный код на языке Delphi, демонстрирующий способ смешивания двух битмапов с использованием прозрачности. Процедура
Процедура работает, итерируя по каждому пикселю в целевом битмапе, и для каждого пикселя вычисляет смешанный цвет на основе исходного пикселя и уровня прозрачности. Если флаг Пример использования демонстрирует, как загрузить файл битмапа, смешать его с другим битмапом и затем нарисовать результат на канвасе. Некоторые предложения по улучшению кода:
В целом, это хороший пример смешивания битмапов с использованием прозрачности в Delphi и демонстрирует некоторые полезные техники для работы с изображениями в программировании. Установка уровня прозрачности изображения позволяет изменять уровень прозрачности части изображения Dest, расположенной над исходным изображением Src. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||