Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Полупрозрачность на Canvas [D6, Win95/98, WinME, NT4, Win2k, WinXP]


_dmitry ©   (2002-12-05 15:40:00) 

Необходимо рисовать многоугольники сквозь которые просвечивался бы рисунок.
Может быть есть реализация альфа каналов в стандартных свойствах канвы (или ее имитация)?
Помогите, плз.


Fenik   (2002-12-07 18:38:00) [1]

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Установка уровня прозрачности изображения

Зависимости: Windows, Graphics, Math
Автор: Nikolas Chook, 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;


_dmitry   (2002-12-06 10:47:00) [2]

2 Axis_of_Evil,
не совсем понял BltTransparent - это где такое есть?

2 ЮЮ,
а что это и где найти можно?


ЮЮ   (2002-12-06 04:13:00) [3]

Есть ещё Grathics32, с иходными текстами


Axis_of_Evil   (2002-12-05 18:42:00) [4]

Авось BitBlt и BltTransparent на Canvas
вот только многоугольники:

var
Bitmap: TBitMap;
begin
Bitmap := TBitMap.Create;
Bitmap.Width, Height ....
Bitmap.Canvas.Polygon

BitBlt/BltTransparent(Bitmap...)

Если я не ошибся и у TBitMap есть Canvas


_dmitry   (2002-12-05 16:59:00) [5]

FastDIB?
Мне очень не хотелось бы использовать сторонние компоненты, из за переноса версий, и совместимости. Это самый крайний способ, если не найду что нибудь лучше....

А может быть можно как-то через WinAPI?


Calm   (2002-12-05 16:43:00) [6]

Есть компоненты для рисования, в которых есть немало всяких полезных штук, в том числе и полупрозраность. Называются FastDeep (или FastDip)
Но где взять не знаю :(


Наверх

Титульная страница Поиск, карта сайта Написать письмо