![]() |
|
|
![]()
|
|
| RESIN |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 8.10.2010 Репутация: нет Всего: нет |
Пересмотрел кучу ссылок, найти решения не смог...
Дано два пикселя p1 и p2 в формате ABGR (непрозрачность, синий, зеленый, красный). Все составляющие от 0 до 255. Нужно наложить один пиксель на другой, т.е. найти результирующий p3 в том же формате ABGR. Пусть мы будем накладывать p2 поверх p1., так вот проблема в том, что p1, как и p2, имеет непрозрачность <255, т.е. он "просвечивается", а значит и p3 тоже должен "просвечиваться". И я не знаю, как рассчитать цвета и прозрачность в этом случае. Составил алгоритм на делфи (пожалуйста, не бейте за привязку к языку, он здесь - не главное), который не учитывает непрозрачность p1: p1, p2, p3 : longint; A, Bg_A : byte; B, G, R : byte; ... A:=(p2 shr 24); Bg_A:=255-A; B:=( ((p2 shl 8) shr 24)*A+((p1 shl 8) shr 24)*Bg_A ) shr 8; G:=( ((p2 shl 16) shr 24)*A+((p1 shl 16) shr 24)*Bg_A ) shr 8; R:=( ((p2 shl 24) shr 24)*A+((p1 shl 24) shr 24)*Bg_A ) shr 8; p3:=R+(G shl 8)+(B shl 16)+$FF000000; // $FF000000=(255 shl 24) - полностью непрозрачный... Мозгов не хватает придумать, как просчитать исходя из условия задачи, а решить очень нужно (висит серьезный курсовой проект с активным использованием графики). Буду ОЧЕНЬ счастлив и признателен, если поможете найти решение. Заранее спасибо. Это сообщение отредактировал(а) RESIN - 11.11.2010, 07:22 |
|||
|
||||
| Pavia |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Условие задачи не полное. Красный зеленый синиц это цвет, а что задает пиксель? К примеру мы имеем источник света фильтр один фильтр второй и глаз на одной линии. Свет светит с яркостью I0=255 во всех каналах так как свет белый. Непрозрачность есть 1-p где p прозрачность. Процен пропускания света. Тогда вопрос что есть r,g,b? Ну наверно пропускание на каналах или не пропускание. Тогда имеем переопределенность. те либы r,g,b лишнее либо aльфа. Еще можно считать что aльфа есть общее значение а r,g,b уточнение. т.е реальное значение R=r*a, G=g*a, B=b*a не значит. не должен. Ты что считаешь? Результат применения фильтера. Или общий фильтр. Если общий то да тогда a3=a1+a2. Если результат действия этого фильтера. То a3=I0-a1-a2. В данном случае I0 есть интенсивность поданная на вход фильтера. Скомбинировав с предыдущим имеем еще вариации. Третий подвох. Свет и глаз смотрят на предмет с одной стороны и мы имеем еще и отражение. Тогда расчеты меняются. А если фильтр еще и сам способен генерировать свет и r,g,b задают яркость генерации, а альфа коэфициент поглощения или усиления. То имеем совершенно разные формулы для расчета. |
|||
|
||||
| RESIN |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 8.10.2010 Репутация: нет Всего: нет |
Спасибо, уже наконец разобрался. 3d, источники света и фильтры тут не причем, задача намного проще.
Дело в том, что я работаю сейчас с png, у меня имеются два изображения: фоновое - большое (4000х4000px), и верхнее - небольшое. Верхнее программно заполняется частями полупрозрачных текстур, хранящихся отдельно (array of array of longint). Пиксели в текстурах хранят цвет по трем составляющим (R, G, B) и значение непрозрачности (A). Тип данных каждого пикселя - longint (впринципе тот же integer) - 4 байта: по одному на R, G, B и A. Только хранятся они в обратном порядке - ABGR. А чтобы отделять эти составляющие используются левые и правые сдвиги, т.к. они работают намного быстрее умножений и темпаче делений. Скажете, можно было нарисовать на ПНГ-шке кусок фона большой текстуры, а потом уже накладывать на непрозрачную область полупрозрачный прямоугольники?, так вот такой подход мне, к сожалению, не подошел (долго объяснять, почему). Ипользовать opengl или direct-x (direct2d) тоже не могу, т.к. предположительно программа должна работать на любых ПК, даже там, где нет установленных библиотек., и сама тема курсовой не предполагает использования графических библиотек (все сложно...). Проблема вся была в том, что пришлось самому написать процедуру копирования части полупрозрачной текстуры на другую, тоже полупрозрачную текстуру. Для каждого пикселя теперь это делается так: a1:=(p1 ShR 24); Bg_a1:=255-a1; a2:=(p2 ShR 24); Bg_a2:=255-a2; B:=( ((p1 shl 8) shr 24)*a1*Bg_a2 shr 8 + ((p2 shl 8) shr 24)*a2 ) shr 8; G:=( ((p1 shl 16) shr 24)*a1*Bg_a2 shr 8 + ((p2 shl 16) shr 24)*a2 ) shr 8; R:=( ((p1 shl 24) shr 24)*a1*Bg_a2 shr 8 + ((p2 shl 24) shr 24)*a2 ) shr 8; A:=255-((Bg_a1*Bg_a2) shr 8); p3:=(A shl 24)+(B shl 16)+(G shl 8)+R; напоминаю, что здесь пиксел p2 накладывается поверх p1, и в итоге получается p3. Это сообщение отредактировал(а) RESIN - 12.11.2010, 13:17 |
|||
|
||||
| x128 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 29.9.2009 Репутация: нет Всего: 7 |
Альфа-канал фонового изображения тебя беспокоить не должен, на реальные значения RGB фона выводи мелкие картинки с учетом прозрачности этих картинок любым доступным способом (png.Draw, windows.AlphaBlend, руками) и если я правильно все понял, получится ожидаемый результат.
|
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |