Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Смашивание цветов пикселей с альфа каналом 
V
    Опции темы
RESIN
Дата 11.11.2010, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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) - полностью непрозрачный...


Мозгов не хватает придумать, как просчитать исходя из условия задачи, а решить очень нужно (висит серьезный курсовой проект с активным использованием графики). smile 
Буду ОЧЕНЬ счастлив и признателен, если поможете найти решение. Заранее спасибо.

Это сообщение отредактировал(а) RESIN - 11.11.2010, 07:22
PM MAIL   Вверх
Pavia
Дата 12.11.2010, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Цитата(RESIN @  11.11.2010,  07:21 Найти цитируемый пост)
 как просчитать исходя из условия задачи, а

Условие задачи не полное.  Красный зеленый синиц это цвет, а что задает пиксель?


К примеру мы имеем источник света фильтр один фильтр второй и глаз на одной линии.

Свет светит с яркостью 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


Цитата(RESIN @  11.11.2010,  07:21 Найти цитируемый пост)
, а значит и p3 тоже должен "просвечиваться".

не значит. не должен. 
Ты что считаешь? Результат применения фильтера. Или общий фильтр.
Если общий то да тогда a3=a1+a2. Если результат действия этого фильтера. То a3=I0-a1-a2. В данном случае I0 есть интенсивность поданная на вход фильтера.  Скомбинировав с предыдущим имеем еще вариации.


Третий подвох. Свет и глаз смотрят на предмет с одной стороны и мы имеем еще и отражение. Тогда расчеты меняются. 
А если фильтр еще и сам способен генерировать свет и r,g,b задают яркость генерации, а  альфа коэфициент поглощения или усиления.
То имеем совершенно разные формулы для расчета.


PM MAIL   Вверх
RESIN
Дата 12.11.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
x128
Дата 13.11.2010, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 29.9.2009

Репутация: нет
Всего: 7



Альфа-канал фонового изображения тебя беспокоить не должен, на реальные значения RGB фона выводи мелкие картинки с учетом прозрачности этих картинок любым доступным способом (png.Draw, windows.AlphaBlend, руками) и если я правильно все понял, получится ожидаемый результат.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0409 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.