Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1218781281
dmitry_12_08_74
2008-08-15 10:21
2009.10.04
Как сделать, чтобы иконка в трее делалась видимой


15-1249167230
DillerXX
2009-08-02 02:53
2009.10.04
нужна электронная мартышка


15-1248790363
Копир
2009-07-28 18:12
2009.10.04
Большой российский суперкомпьютер.


15-1249065216
tesseract
2009-07-31 22:33
2009.10.04
Захватившие власть коммуноцентристы опять ...


2-1248705880
xyz
2009-07-27 18:44
2009.10.04
listbox не ловит нажатие Del





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский