Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.04;
Скачать: CL | DM;

Вниз

Полупрозрачная заливка Canvas   Найти похожие ветки 

 
Strate ©   (2009-06-18 12:11) [0]

Уважаемые мастера, подскажите пожалуйста как решить следующую проблему:

Есть Canvas. На нём нечто нарисовано. Есть цвет (например clRed), есть степень прозрачности цвета (ну например 125). Как залить Canvas этим цветом с учётом прозрачности?


 
MBo ©   (2009-06-18 12:31) [1]

WinAPI-функция AlphaBlend


 
Strate ©   (2009-06-18 12:51) [2]

Хм, обнаружил для себя отлично работающую функцию AlphaBlend в VirtualTrees.pas (основной модуль компонента VirtualTreeView). Её то и заюзал ) Если интересно, функцию могу сюда привести.


 
Инкогнито   (2009-06-18 16:12) [3]

Давай.
Только покомендовали Windows.AlphaBlend.


 
Strate ©   (2009-06-18 16:42) [4]

Оказалась функция не слишком то хорошо рабочей. В некоторых ситуациях (например если перемещать окно по области, которая рисуется с использованием это функции прозрачности вываливается AV, причём на участке ассемблерной вставки).

В общем посмотрел я описание Windows.AlphaBlend, наверно это пока выше моего понимания :) Можете привести примерчик использования функции?


 
Sapersky   (2009-06-18 18:00) [5]

http://sapersky.narod.ru/files/AlphaBlend_VCL_test.rar

Но это вывод битмапа с полупрозрачностью, в случае, если нужен просто цвет - несколько избыточно.
Или см. Graphics32, там есть функции рисования граф. примитивов с полупрозрачностью, многоугольников и прочего. Но они рисуют не на экран, а в свой буфер (TBitmap32 или как его).


 
PROgrammist   (2009-06-18 18:33) [6]

На чистом GDI,  для задания цвета альфы, я создавал DC, заливал нужным цветом (Дело это быстрое) и смешивал. Получалась цветная полупрозрачность.


 
Strate ©   (2009-06-18 18:45) [7]

PROgrammist   (18.06.09 18:33) [6]

Вот мне интересно именно, как смешивать? Попробовал через pixels[x,y] - жуть как медленно. ScanLine свойства у Canvas не нашёл.


 
PROgrammist   (2009-06-18 18:55) [8]

Windows.AlphaBlend.


 
Sapersky   (2009-06-18 19:47) [9]

Ну если нужно обязательно на Canvas - тогда альтернативы AlphaBlend нет.
Другое дело, что при выводе графики буферизация (рисование всего в промежуточный битмап и потом вывод его на Canvas) вообще полезна - нет мерцания, доступен сканлайн, иногда может быть быстрее (тот же AlphaBlend быстрее работает).


 
Andy BitOff ©   (2009-06-18 20:31) [10]

А я как любитель и ценитель предпочел бы GDI+


 
Strate ©   (2009-06-19 00:33) [11]

Sapersky,
спасибо большое за пример, разобрался с AlphaBlend-функцией WinAPI.

Выкрутился так: создаём битмап, заливаем его цветом и микшируем с результирующей канвой.


 
antonn ©   (2009-06-19 00:37) [12]


> Strate ©   (18.06.09 18:45) [7]
>
> PROgrammist   (18.06.09 18:33) [6]
>
> Вот мне интересно именно, как смешивать? Попробовал через
> pixels[x,y] - жуть как медленно. ScanLine свойства у Canvas
> не нашёл.

создай буферный битмап, скопируй на него канвас, обработай и скопируй обратно :)


 
CSS   (2009-08-02 04:16) [13]

Sapersky, объясните пожалуйста, что за функция такая в вашем примере:

procedure PremultAlpha(b : TBitmap);
Var i : Integer;
   q : PRGBQuad;
begin
q := b.Scanline[b.Height-1];
for i := 0 to b.Height*b.Width-1 do begin
 q.rgbBlue  := q.rgbBlue  * q.rgbReserved shr 8;
 q.rgbGreen := q.rgbGreen * q.rgbReserved shr 8;
 q.rgbRed   := q.rgbRed   * q.rgbReserved shr 8;
 inc(q);
end;
end;


- после загрузки полупрозрачного 32-х-битного изображения из файла его сразу же обрабатывает эта функция...

Я всегда пробовал делать вот так:

Var bf: BLENDFUNCTION;
...
bf.BlendOp:=AC_SRC_OVER;
bf.BlendFlags:=0;
bf.AlphaFormat:=AC_SRC_ALPHA;
bf.SourceConstantAlpha:=255;
...
Windows.AlphaBlend(Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, bf);


Всё выводилось вроде, но результат получался как бы какой-то искаженный весь... А так стало нормально...



Страницы: 1 вся ветка

Текущий архив: 2009.10.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
2-1249027595
webpauk
2009-07-31 12:06
2009.10.04
Рисование в TEdit


1-1218789274
dmitry_12_08_74
2008-08-15 12:34
2009.10.04
Как заставить таскбар развернуться, чтобы показать все иконки?


15-1249311936
Простоинтересно
2009-08-03 19:05
2009.10.04
За сколько бы вы написали аналог Windows блокнота?


1-1218185285
pogi
2008-08-08 12:48
2009.10.04
1С OLE запись - в полях значения "<>"


15-1248772370
yantux
2009-07-28 13:12
2009.10.04
ускорение 2D