Russian Qt Forum
Апреля 21, 2025, 09:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: Сложить 2 QColor  (Прочитано 28065 раз)
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.068 секунд. Запросов: 20.