Расцветка к или далеко от оттенка на определенный процент

Я пробую, эмулируют Эффект Оттенка, Открывают XML. То, что это делает, изменить оттенок пикселей в изображении путем смещения оттенка. Требуется 2 параметра: 1) hue (в градусах) и 2) amt (сумма, процент). Это - № 2, с которым у меня есть проблемы. Состояния спецификации:

Оттенок: значения цвета эффекта Сдвигов или к или далеко от оттенка указанной суммой.

  • количество (Сумма) - Указывает тем, насколько значение цвета смещается.
  • оттенок (Оттенок) - Указывает оттенок, к которому можно окрасить.

Не беря в голову конструкцию XML, я могу эмулировать значения, которые имеют amt из 100%. Так, например, если я хочу Синий (оттенок: 240 °), я могу создать это (Крашеное). Вот пример:

Исходный и крашеный (оттенок = 240, сумма = 100%).
OriginalModified

Это достигается просто путем установки оттенка на 240, сохранения насыщенности и яркости тем же и преобразования в RGB и записи каждого пикселя.

Вот то, чего я не могу достигнуть хотя:

(Синий) Hue=240, Сумма = 30%, 50% и 80%, соответственно
30%50%80%

Снова, спецификация для Amount говорит Указывает тем, насколько значение цвета смещается. Я попробовал все виды путей здесь, чтобы заставить это работать, но не могу казаться (hue=hue*amount, originalhue * amount + hue, и т.д.)

Больше примеров: (зеленый) Hue=120, Сумма = 30%, 50%, 80% и 100%, соответственно. 100% один я могу добраться.
30%50%80%100%

Вот некоторые списки значения единственного пикселя в изображениях выше:

Пиксель 159, 116 - синие изображения

        Hue    Amount    R    G    B    | H    S     L
Original                 244  196   10  |  48  0.92  0.5
Blue    240     30%      237   30   45  | 356  0.85  0.52
Blue    240     50%      245    9  156  | 323  0.93  0.5
Blue    240     80%      140   12  244  | 273  0.91  0.5
Blue    240    100%       12   12  244  | 240  0.91  0.5

Пиксель 159, 116 - зеленые изображения

        Hue    Amount    R    G    B    | H    S     L
Original                 244  196   10  |  48  0.92  0.5
Green    120     30%     211  237   30  |  68  0.85  0.52
Green    120     50%     159  237   30  |  83  0.85  0.52
Green    120     80%      81  237   29  | 105  0.85  0.52
Green    120    100%      29  237   29  | 120  0.85  0.52


Так, вопрос: кто-либо знает, как это должно работать?

Примечание: Это не дубликат:

5
задан Community 23 May 2017 в 11:45
поделиться

2 ответа

Я совершенно уверен, что ваша проблема возникает из-за того, как вы интерполируете углы. Вот функция интерполяции (написанная на языке python), которая должна помочь. Она основана на предложении из темы Кратчайшая 2D интерполяция углов на форумах xna.

def wrap(value, lower, upper):
    distance = upper - lower
    return value - ((value-lower)//distance)*distance

def shortestangle(a,b):
    angle = wrap(b-a, 0, 360)
    if angle>=180: angle -= 360
    return angle

def interpolate(a,b,amount):
    return (a+shortestangle(a,b)*amount)%360

Теперь, interpolate(originalHue,hue,amount) должен дать желаемый результат.

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

Color Wheel
(источник: sapdesignguild.org)

Проблема в том, что смешивание (или интерполяция) двух углов не является тривиальным, поэтому код типа hue = ((hue - originalHue) * amount) + originalHue не будет работать. Существует бесконечное количество способов перехода от одного угла к другому из-за того, что 360° - это угол поворота. Чтобы перейти от 0° к 60°, можно повернуть на 60° против часовой стрелки, на 420° против часовой стрелки, на 300° по часовой стрелке и т.д. Обычно желаемым является наименьший угол.

Например, рассмотрим шеи пингвинов: если ваш исходный оттенок - 30° (оранжевый), цель - 240° (синий), а количество - 50%, вы получите следующие результаты:

//Linear Interpolation
(30° + (240° - 30°)*0.5) = 135° (green)

//"Shortest 2D Angle Interpolation"
(30° + shortestangle(30°,240°)*0.5) % 360 = (30° + (-150°)*0.5) % 360 = 315° (magenta)

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

6
ответ дан 14 December 2019 в 08:42
поделиться

Вы должны взглянуть на TintParams в GDI+ (хотя и не является частью .NET) - это может быть именно то, что вы ищете.

1
ответ дан 14 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: