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

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

Математика наложения [D7, WinXP]


Ricks ©   (2007-04-02 11:03:00) 

Есть две картинки, содержащие alpha канал (будем считать это слоями). Как наложить их друх на друга так, чтобы цвета этих точек усреднялись должным образом. Например:
если на полупрозрачный (50%) черный наложить 50% белый то получим 75% цвет (170, 170, 170), если же наоборот — получим 75% цвет (85, 85, 85).
Значение альфа вычисляется по формуле:
A = (a0/255 + (1-a0/255)*a1/255) * 255;
А вот как быть с цветом?


oxffff   (2007-04-02 13:38:00) [1]


> А должны были получить (255, 255, 255, 127)!


Кто должен?


TRUNK   (2007-04-02 12:42:00) [2]

Перед автором стоит задача преобразовать два последовательных наложение в одно, которое приведёт к эквивалентному результату.


> если он полупрозрачный, откуда (255, 255, 255)?
> (127, 127, 127) как раз и означает, что черезн него "просвечивается"
> черный

Наложение происходит на полностью прозрачныйчёрный цвет, т.е. его как бы и нет, в результате у нас остаётся только наложенный белый.


Ricks   (2007-04-02 12:39:00) [3]


> TRUNK ©


СПАСИБО тебе огромное!!!!


Ricks   (2007-04-02 12:37:00) [4]


> ЮЮ


> "просвечивается" черный

но ведь черный то — полностью прозрачный, т.е никакого черного там не должно быть!


ЮЮ   (2007-04-02 12:33:00) [5]

> А должны были получить (255, 255, 255, 127)!

если он полупрозрачный, откуда (255, 255, 255)?
(127, 127, 127) как раз и означает, что черезн него "просвечивается" черный. В результате имеем "серый"


Ricks   (2007-04-02 12:32:00) [6]

Сейчас испытаю!


TRUNK   (2007-04-02 12:29:00) [7]

NewAlpha = 1 - (1-Alpha_1)*(1-Alpha_2);
NewRed = (Red_1*Alpha_1*(1-Alpha_2) + Red_2*Alpha_2)/NewAlpha
NewGreen = (Green_1*Alpha_1*(1-Alpha_2) + Green_2*Alpha_2)/NewAlpha
NewBlue = (Blue_1*Alpha_1*(1-Alpha_2) + Blue_2*Alpha_2)/NewAlpha

P.S. Все значения в диапазоне [0..1]


Ricks   (2007-04-02 12:25:00) [8]

Спасибо, но эта формула не работает.
Смотри:
если фон (0, 0, 0, 0) (полность. прозрачный черный цвет) и на него мы накладываем 50% (255, 255, 255, 127) белый то получим в итоге:

255 * 127 / 255 + {0 * (255 - 127) / 255]|=0} = 127

А должны были получить (255, 255, 255, 127)!


oxffff   (2007-04-02 12:08:00) [9]

Примени эту формулу для R,G,B составляющих по отдельности


oxffff   (2007-04-02 12:07:00) [10]

displayColor = sourceColor* alpha/255 + backgroundColor* (255 – alpha) /255


Ricks   (2007-04-02 12:01:00) [11]

Хотя может быть и формула для alpha неправильная... :(


Наверх

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