Установка уровня прозрачности изображения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 прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |