Arlert Ответов: 2

Обнаружение исходного цвета после смешивания rgb


Попытка обнаружить исходный цвет после смешивания его с другим.

Что я уже пробовал:

Например:
			A	R	G	B
source		255	128	64	64
overlay		204	0	128	128
result		255	26	115	115
После смешивания исходного цвета с наложением (в обычном режиме смешивания) я получаю результирующий цвет.
Зная, что исходная альфа и результирующая Альфа являются константами, для вычисления результирующего цвета я использую эту формулу:
result.red = source.red + (overlay.red - source.red) * overlay.alpha / 255;
соответственно для остальных синих и зеленых каналов та же формула.
Первая проблема, с которой я сталкиваюсь, заключается в том, что результирующее значение округляется, поэтому вместо 25,6 (для результата R) я получу 26 (потому что rgb-это байтовые значения).
Таким образом, это вызовет проблему при обнаружении исходного цвета, зная только результат и наложение. Итак, используя эту формулу:
source.red = (255 * result.red - overlay.red * overlay.alpha) / (255 - overlay.alpha)
приведет к исходному красному значению = 130 вместо 128 (потому что результирующее красное значение равно 26 вместо 25,6).
Есть идеи, как можно вычислить исходный цвет по-другому?

2 Ответов

Рейтинг:
6

Patrice T

Цитата:
Первая проблема, с которой я сталкиваюсь, заключается в том, что результирующее значение округляется, поэтому вместо 25,6 (для результата R) я получу 26 (потому что rgb-это байтовые значения).

Это проблема, когда вы используете целые числа в формуле, которая использует деление и что то, что делится, не кратно делителю. Там неизбежно теряется.
Цитата:
Есть идеи, как можно вычислить исходный цвет по-другому?

Нет никакого решения до тех пор, пока вы придерживаетесь целых чисел, и вы не можете изменить его, так как цвета-это целые числа.


Рейтинг:
0

Steve44

Единственный способ избежать проблем, возникающих из-за округления, - это избежать округления.

В своем описании вы не упомянули, каковы типы данных для цветов, но, похоже, они являются целыми числами, поэтому каждая точность ваших вычислений, которая "округляется", исчезает в целочисленном случае, и нет никакого способа вернуть это обратно.

Один из вариантов предотвращения этой ситуации-хранить ваши цвета либо в виде значений с плавающей точкой, либо в виде значений с фиксированной точкой, чтобы вы не теряли точность из-за округления. Если это возможно, это зависит от других ограничений вашей проблемы.

Другой вариант, который был бы возможен, - это вместо того, чтобы пытаться вычислить исходное значение, вычислить диапазон источников. В вашем примере результирующего цвета 26 Вы бы решили исходный цвет для результирующего цвета 25,5 и 26,5. Это приведет к минимальному и максимальному исходному цвету, который дает округленный результирующий цвет. Это может не дать вам вашего исходного исходного цвета (что является невыполнимой задачей), но вы знаете, в каком диапазоне находился источник.