Учитывая триплет R,G,B и коэффициент F, как рассчитать версию цвета с водяным знаком?
У меня есть триплет (R, G, B), где каждый цвет находится в диапазоне от 0,0 до 1,0. Учитывая коэффициент F (0,0 означает исходный цвет, а 1,0 означает белый), я хочу вычислить новый триплет, который является "цветовой меткой" версии цвета.
Я использую следующее выражение (псевдокод):
for each c in R, G, B:
new_c ← c + F × (1 - c)
Это производит что-то, что выглядит хорошо, но я понимаю, что это вносит отклонения в оттенок цвета (проверка эквивалента HSV до и после преобразования), и я не знаю, следует ли этого ожидать.
Существует ли "стандартный" (с кавычками или без) алгоритм для расчета "цветовой" версии цвета? Если да, то что это? Если нет, то какие еще алгоритмы для такого же эффекта вы можете мне сказать?
2 ответа
На самом деле это выглядит так, как будто это должно дать правильный оттенок, минус небольшие вариации для арифметических ошибок округления.
Это, безусловно, разумно, просто было добиться эффекта водяного знака. Я не знаю других "стандартных", есть несколько способов сделать это.
Альтернативы:
Смешайте с белым, но сделайте это нелинейно на F, например new_c = c + sqrt(F)*(1-c)
или вы можете использовать другие нелинейные функции - это может помочь водяному знаку выглядеть более или менее "плоским".
Вы могли бы сделать это более эффективно, выполнив следующее (где F принимает диапазон 0..INF):
new_c = 1 - (1-c)/pow(2, F)
для реальных значений пикселей (0..255) это будет преобразовано в:
new_c = 255 - (255-c)>>F
Мало того, что это достаточно быстро в целочисленной арифметике, вы можете сделать это параллельно с 32-целым целым числом.
Почему не просто?
new_c = F*c
Я думаю, что вы должны сначала пройтись по пикселям с водяными знаками и выяснить, должно ли оно быть темнее или светлее.
Для более легкой формулы может быть new_c=1-F*(c-1)