Страница: 1 |
Вопрос: По какой формуле в винде накладываются изображения | Добавлено: 07.06.07 01:07 |
Автор вопроса: ![]() |
Доброго вам времени суток!
Может ли кто подсказать по какой формуле в винде изображения накладываются друг на друга? в том смысле что скажем есть пиксель цвета R1,G1,B1 и прозрачностью A1, то как будет высчитываться цвет если пиксель "под ним" имеет цвет R2, G2, B2? А то чет никак не могу сам додуматься... Заранее спасибо. |
Ответы | Всего ответов: 12 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 454 |
Профиль | Цитата | #1 | Добавлено: 07.06.07 01:55 |
R2 = R1 + (1 - A1) * R2 |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 454 |
Профиль | Цитата | #2 | Добавлено: 07.06.07 02:00 |
посмотри BLENDFUNCTION (MSDN) |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ICQ: 308-534-060 Вопросов: 20 Ответов: 1860 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 07.06.07 15:50 |
EUGY,
R2 = R1 + (1 - A1) * R2
С этим не соглашусь в корне! Подумай хотя бы логически. Математически примерно так: R3 = INT((A1 * R1 + (255 - A1)* R2)/255) G3 = INT((A1 * G1 + (255 - A1)* G2)/255) B3 = INT((A1 * G1 + (255 - A1)* G2)/255) Фактически на ассемблере это должно описываться более лаконично.. А что, если надо рассчитать цвет на пересечении точек с разной прозрачностью (как набор слоев в Фотошоп)? Видимо расчет идет снизу вверх между результирующим цветом и цветом последующего по шкале Z. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 454 |
Профиль | Цитата | #4 | Добавлено: 07.06.07 18:09 |
QUOTE]С этим не соглашусь в корне![
И слава Богу. BLENDFUNCTION |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 46 Ответов: 848 |
Профиль | Цитата | #5 | Добавлено: 07.06.07 19:13 |
Если без гаммы - то r = r1 + (r2 - r1) * alpha \ 256. Но на практике нужно гамму учитывать - перед блендингом брать квадратный корень из цветовых коэффицентов, а итоговое значение возводить в квадрат. Естественно, делать это нужно через таблицы. |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 07.06.07 23:21 |
R2 = A1 * R1 + (1 - A1) * R2
я бы еще поверил |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 233628153 Вопросов: 13 Ответов: 29 |
Профиль | Цитата | #7 | Добавлено: 08.06.07 00:21 |
Если без гаммы ... А я то думаю, чего в моей проге высчитанные цвета прям светятся 8) Можно поподробнее что именно возводится в квадрат?
ЗЫ: прога цвета не накладывает, а наоборот... |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 46 Ответов: 848 |
Профиль | Цитата | #8 | Добавлено: 08.06.07 13:19 |
Можно поподробнее что именно возводится в квадрат?
Поскольку свет является волновым явлением, мощность светового потока квадратично пропорциональна его амплитуде. А амплидуда у хорошего монитора есть цифровое значение светового коэффицента на входном сигнале. Таким образом 128-я градация серого, имеющая половинную амплитуду от 256-й, на деле в четыре раза слабее последней. Белый свет приближенно можно считать шумом нормального распределения, а по закону наложения таких шумов amp(nrnd+nrnd)=amp(nrnd*sqrt(2)), т.е. средняя амплитуда двух наложенных шумов возрастает в корень квадратный из двух раз по сравнению с оригиналом. Таким образом, сложив две 128-е градации серого, мы получим не белый цвет, а sqrt((128/255)*(128/255)+(128/255)*(128/255))*255 = 181-ю градацию серого. Принцип, думаю, понятен. Создаешь таблицу с 256 значениями, берущую квадратный корень: For I = 0 To 255 sqrttab(I) = CByte(Int(Sqr(CDbl(I) / 255) * 255 + 0.5)) Next I А смешивание цветов с использованием таблицы делай как-то так (Значения параметра Alpha - от 0 до 256): Function BlendValues(ByVal V1&, ByVal V2&, ByVal Alpha& ![]() V1 = V1 * V1 \ 256 BlendValues = sqrttab(Max(Min(V1 + (V2 * V2 \ 256 - V1) * Alpha \ 256, 255), 0)) End Function Max и Min в принципе необязательны, это для стабильности. Для повышения качества бленда можно увеличить число градаций мощности до 4096, соответственно изменив код. |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ICQ: 308-534-060 Вопросов: 20 Ответов: 1860 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 08.06.07 15:31 |
Во как загнул. А можно ссылочку типа RTFM? ![]() |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 46 Ответов: 848 |
Профиль | Цитата | #10 | Добавлено: 09.06.07 12:14 |
А можно ссылочку типа RTFM?
![]() Даже не знаю... А зачем? |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 09.06.07 13:08 |
Мне тоже интересно, откуда дровишки. |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 46 Ответов: 848 |
Профиль | Цитата | #12 | Добавлено: 09.06.07 14:13 |
Да ниоткуда... собственные наблюдения. |
Страница: 1 |
|