Обсуждение статьи "Изучаем класс CCanvas. Реализация прозрачности графических объектов" - страница 6

 
Dmitry Fedoseev:

А как? Сам-то экспериментировал?

Я решил эту задачу четыре года назад, но изрядно поломав голову.
Выложу решение если увижу изрядную мозговую активность и при этом никто не найдет решение.
 

Уфффф... все намного проще оказалось, фильтровать не надо перед сложением. Компоненты просто складываются пропорционально прозрачности и непрозрачности:

r=lr*(255-Alpha)/255+ur*Alpha/255;
g=lg*(255-Alpha)/255+ug*Alpha/255;
b=lb*(255-Alpha)/255+ub*Alpha/255;

Alpha: 255 - верхний слой непрозрачен, 0 - полностью прозрачен. 

lr, lg, lb - компоненты нижнего слоя. 

ur, ug, ub - компоненты верхнего слоя. 

Вот в терминале, черный фон, красный квадрат непрозрачный, на нем синий с прозрачностью 50% и потом желтый с прозрачностью 50%

Вот тоже самое в фотошопе:


 
Dmitry Fedoseev:

Уфффф... все намного проще оказалось, фильтровать не надо перед сложением. Компоненты просто складываются пропорционально прозрачности и непрозрачности:

Alpha: 255 - верхний слой непрозрачен, 0 - полностью прозрачен. 

lr, lg, lb - компоненты нижнего слоя. 

ur, ug, ub - компоненты верхнего слоя. 

доберусь до компа, попробую смешать две прозрачные картинки по этой флрмуле и посмотрим что получится. :))
 
Nikolai Semko:
доберусь до компа, попробую смешать две прозрачные картинки по этой флрмуле и посмотрим что получится. :))

А как можно две прозрачные смешивать? Сначала одна накладывается на фон, потом вторая накладывается на получившееся.

Вообще можно и две прозрачных сложить как-то, а потом ее накладывать на фон, но сейчас не об этом.

***

Вот что было бы особо интересно - разораться со всеми методами наложения слоев как в фотошопе.

 
Dmitry Fedoseev:

Уфффф... все намного проще оказалось, фильтровать не надо перед сложением. Компоненты просто складываются пропорционально прозрачности и непрозрачности:

r=lr*(255-Alpha)/255+ur*Alpha/255;
g=lg*(255-Alpha)/255+ug*Alpha/255;
b=lb*(255-Alpha)/255+ub*Alpha/255;

Alpha: 255 - верхний слой непрозрачен, 0 - полностью прозрачен. 

lr, lg, lb - компоненты нижнего слоя. 

ur, ug, ub - компоненты верхнего слоя. 

Вот в терминале, черный фон, красный квадрат непрозрачный, на нем синий с прозрачностью 50% и потом желтый с прозрачностью 50%

Вот тоже самое в фотошопе:

не то ...

речь о том, что существует Alpha1 и Alpha2

так же нужно рассчитывать кроме новообразующих цветов смешения еще и новообразующую прозрачность. 

Вы по сути повторили формулу автора статьи смешения прозрачного цвета с фоном:

result=backgraund*(1-alpha)+foreground

а у Вас:

result=backgraund*(1-alpha)+foreground*alpha

Ваш вариант правильный, а вот автор статьи накосячил в простой формуле, и прикольно, что Петр его благодарит за эту формулу :))

Ведь невооруженным глазом видно, что в формуле автора легко наступает переполнение uchar. Странно что за 4 года никто не увидел эту грубую ошибку.

 

вот здесь применяется алгоритм смешения друх прозрачных цветов:


 
А зачем смешивать два прозрачных слоя, что бы потом их накладывать? Сначала один слой наложить, подом другой.
 
Nikolai Semko:

вот здесь применяется алгоритм смешения друх прозрачных цветов:


А в каком месте прозрачность? Тени?

 
Dmitry Fedoseev:

А в каком месте прозрачность? Тени?

тень и край слаженной окружности. 
Ведь пиксель на краю сглаживания имеет тот же цвет но другую прозрачность.
 

Николай, мне сейчас не до цветов. Если в формуле есть ошибка, спасибо что подметил. Я сильно не проверял, - внедрил и забыл.

Хорошо бы твои знания и достижения в области канваса применить в чем то полезном. Подумай над этим.

Причина обращения: