Форум: "Начинающим";
Текущий архив: 2009.10.04;
Скачать: [xml.tar.bz2];
ВнизПолупрозрачная заливка 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c