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

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

Полупрозрачная заливка Canvas


Strate ©   (2009-06-18 12:11:00) 

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

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


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

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);


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


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


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

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


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

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

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


Andy BitOff   (2009-06-18 20:31:00) [4]

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


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

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


PROgrammist   (2009-06-18 18:55:00) [6]

Windows.AlphaBlend.


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

PROgrammist   (18.06.09 18:33) [6]

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


PROgrammist   (2009-06-18 18:33:00) [8]

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


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

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

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


Strate   (2009-06-18 16:42:00) [10]

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

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


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

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


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

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


MBo   (2009-06-18 12:31:00) [13]

WinAPI-функция AlphaBlend


Наверх

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