Russian Qt Forum
Ноябрь 23, 2024, 07:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: Сложить 2 QColor  (Прочитано 26995 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Январь 26, 2013, 12:59 »

Дайте формула абсолютного топлива для расчета суммы цветов, будем проверять. Улыбающийся
Ну интересно, а мне кто ее даст? Улыбающийся  А проверить можем

a = (255, 0, 0, 0)  // ARGB. черный, альфа 255
b = (0, 255, 255, 255)  // белый, альфа 0

У второго цвета альфа = 0 значит черный, был, черный, и остался. А у Вас чего-то белый....

Edit: виноват, напутал в цифирках, подправил
« Последнее редактирование: Январь 26, 2013, 13:11 от Igors » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #16 : Январь 26, 2013, 13:03 »

Помню, эта тема уже как то обсуждалась на этом форуме.. Страниц на десяток с обсуждением (эмоциональным и рукомахательным) и вроде даже в конце пришли к чему то)) 
Ну так наверное Вы и решение помните - вот и приведите  Улыбающийся

Не, не.. я лучше понаблюдаю) А то я тут уже и за винцом подумываю сходить)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #17 : Январь 26, 2013, 13:11 »

Ну интересно, а мне кто ее даст? Улыбающийся  А проверить можем
Что проверить? Давайте математику.
А если у вас ее нет, то почему вы решили, что она есть у разработчиков Qt или вообще есть?
Как это делает фотошоп, нужно спрашивать у его разработчиков. Как это сделано в gimp можно посмотреть в его исходниках, но я сильно сомневаюсь что это одинаковые алгоритмы.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #18 : Январь 26, 2013, 13:12 »

Не, не.. я лучше понаблюдаю)
Я тоже. Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #19 : Январь 26, 2013, 13:17 »

Помню, эта тема уже как то обсуждалась на этом форуме.. Страниц на десяток с обсуждением (эмоциональным и рукомахательным) и вроде даже в конце пришли к чему то)) 
Ну так наверное Вы и решение помните - вот и приведите  Улыбающийся

Не, не.. я лучше понаблюдаю) А то я тут уже и за винцом подумываю сходить)

Пошёл искать ту тему и не нашёл чёта((
Зато нашёл аналогичную: http://www.prog.org.ru/topic_18922_0.html
Но, та, конечно, была интересней)) Перечитал бы ещё раз с удовольствием)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Январь 26, 2013, 13:20 »

Не, не.. я лучше понаблюдаю) А то я тут уже и за винцом подумываю сходить)
Да как же так? Только что Вы уверенно заявляли что занимаетесь инженерными расчетами, а тут сразу в кусты да за винцом  Улыбающийся

Что проверить? Давайте математику.
А если у вас ее нет, то почему вы решили, что она есть у разработчиков Qt или вообще есть?
Как это делает фотошоп, нужно спрашивать у его разработчиков. Как это сделано в gimp можно посмотреть в его исходниках, но я сильно сомневаюсь что это одинаковые алгоритмы.
Ладно, не Ваша предметная область, даю. Для каждой RGB компоненты

sum_color = (color_1 * alpha_1 + color_2 * alpha_2) / (alpha_1 + alpha_2);

А оператор за Вами
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #21 : Январь 26, 2013, 13:21 »

Но, та, конечно, была интересней)) Перечитал бы ещё раз с удовольствием)
Лови: http://www.prog.org.ru/topic_14700_0.html Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #22 : Январь 26, 2013, 13:22 »

А оператор за Вами
Итоговая альфа?
Для этой формулы есть ограничения: два цвета не могут одновременно иметь alpha = 0. Улыбающийся
« Последнее редактирование: Январь 26, 2013, 13:27 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Январь 26, 2013, 13:32 »

Итоговая альфа?
Для этой формулы есть ограничения: два цвета не могут одновременно иметь alpha = 0. Улыбающийся
Итоговая альфа = просто сумме (это уже говорилось выше). Да, если обе альфы 0, то выходной RGB цвет не определен. Однако поскольку выходная альфа тоже 0, то для юзверя все норм. Такие коллизии надо решать самостоятельно, здесь уже предметная часть здесь ни при чем.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #24 : Январь 26, 2013, 13:36 »

Такие коллизии надо решать самостоятельно, здесь уже предметная часть здесь ни при чем.
Не в вашем случае... Здесь лучше переспросить. Подмигивающий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #25 : Январь 26, 2013, 13:58 »

Код
C++ (Qt)
static inline qreal c_to_f( int v ) { return qreal( v ) / 255.; }
 
QColor operator+( const QColor &c1, const QColor &c2 )
{
   if( !c1.alpha() && !c2.alpha() )
     return QColor( 0, 0, 0, 0 );
 
   qreal a1 = c_to_f( c1.alpha() );
   qreal a2 = c_to_f( c2.alpha() );
   qreal a = qBound( 0., a1 + a2, 1. );
 
   qreal r = qBound( 0., ( ( c_to_f( c1.red() ) * a1 + c_to_f( c2.red() ) * a2 ) / a, 1. );
   qreal g = qBound( 0., ( ( c_to_f( c1.green() ) * a1 + c_to_f( c2.green() ) * a2 ) / a, 1. );
   qreal b = qBound( 0., ( ( c_to_f( c1.blue() ) * a1 + c_to_f( c2.blue() ) * a2 ) / a, 1. );;
 
   return QColor::fromRgbF( r, g, b, a );
}
 

Писал прямо здесь, могут быть опечатки.

От c_to_f можно отказаться, значения компонентов для вещественных чисел уже возвращаются приведенные к отрезку 0...1.
Код
C++ (Qt)
QColor operator+( const QColor &c1, const QColor &c2 )
{
   if( !c1.alpha() && !c2.alpha() )
     return QColor( 0, 0, 0, 0 );
 
   qreal a1 = c1.alphaF();
   qreal a2 = c2.alphaF();
   qreal a = qBound( 0., a1 + a2, 1. );
 
   qreal r = qBound( 0., ( c1.redF() * a1 + c2.redF() * a2 ) / a, 1. );
   qreal g = qBound( 0., ( c1.greenF() * a1 + c2.greenF() * a2 ) / a, 1. );
   qreal b = qBound( 0., ( c1.blueF() * a1 + c2.blueF() * a2 ) / a, 1. );
 
   return QColor::fromRgbF( r, g, b, a );
}
 
« Последнее редактирование: Январь 26, 2013, 14:38 от Old » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #26 : Январь 26, 2013, 14:08 »

Не, не.. я лучше понаблюдаю) А то я тут уже и за винцом подумываю сходить)
Да как же так? Только что Вы уверенно заявляли что занимаетесь инженерными расчетами, а тут сразу в кусты да за винцом  Улыбающийся

Так я уже говорил об этом..
Код
C++ (Qt)
const QColor operator+(const QColor &c1, const QColor &c2) {
 
   qreal x = 0.5 * (1.0 - c1.alphaF() + c2.alphaF());
 
   qreal alpha  = 0.5 * (c1.alphaF() + c2.alphaF());
   qreal red     = c1.redF() * (1.0 - x) + x * c2.redF();
   greal green  = c1.greenF() * (1.0 - x) + x * c2.greenF();
   qreal blue    = c1.blueF() * (1.0 - x) + x * c2.blueF();
 
   return QColor(red, green, blue, alpha);
}
 

Но, та, конечно, была интересней)) Перечитал бы ещё раз с удовольствием)
Лови: http://www.prog.org.ru/topic_14700_0.html Улыбающийся
Да, были времена  Крутой

 
« Последнее редактирование: Январь 26, 2013, 14:18 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #27 : Январь 26, 2013, 14:42 »

Писал прямо здесь, могут быть опечатки.
Опечатки переживем, по сути

- (cosmetic) Вместо qBound лучше смотрится qMin

- (bug) Вы подрезаете альфу ДО деления на нее, а надо после. Напр я складываю белый + черный. Если обе альфы = 255, должен получиться серый

- (performance) пусть один QColor или оба хранятся напр в HSV. Тогда обращение к каждой компоненте вызывает конверсию HSV->RGB, что весьма недешево.

Исправьте пожалуйста, пипл любит текст для copy/paste

Так я уже говорил об этом..
Код
C++ (Qt)
const QColor operator+(const QColor &c1, const QColor &c2) {
 
   qreal x = 0.5 * (1.0 - c1.alphaF() + c2.alphaF());
 
Так что, выходит от перестановки слагаемых сумма меняется? (ведь альфы у Вас неравноправны).
« Последнее редактирование: Январь 26, 2013, 16:04 от Igors » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #28 : Январь 26, 2013, 14:48 »

- (cosmetic) Вместо qBound лучше смотрится qMin
qBound это по сути qMax и qMin.

- (bug) Вы подрезаете альфу ДО деления на нее, а надо после. Напр я складываю белый + черный. Если обе альфы = 255, должен получиться серый
Это спорно. Улыбающийся Возможно это баг именно в вашей модели.

- (performance) пусть один QColor или оба хранятся напр в HSV. Тогда обращение к каждой компоненте вызывает конверсию HSV->RGB, что весьма недешево.
Мы говорим только о:
Цитировать
Складывать ARGB. При переполнении обрезать (клиппить). Словом: ARGB модель

Исправьте пожалуйста, пипл любит текст для copy/paste
Так велком. Улыбающийся

« Последнее редактирование: Январь 26, 2013, 14:52 от Old » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #29 : Январь 26, 2013, 14:49 »


Так я уже говорил об этом..
Код
C++ (Qt)
const QColor operator+(const QColor &c1, const QColor &c2) {
 
   qreal x = 0.5 * (1.0 - c1.alphaF() + c2.alphaF());
 
Так что, выходит от перестановки слагаемых сумма меняется? (ведь альфы у Вас неравноправны).


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

пояснение:
при перестановки c1 и с2, x переходит в 1-x, а 1-x в x.
Поэтому всё корректно)

 
« Последнее редактирование: Январь 26, 2013, 14:58 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: 1 [2] 3 4 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.238 секунд. Запросов: 23.