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