![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Полупрозрачность на 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)
Но где взять не знаю :(