Я пробую, эмулируют Эффект Оттенка, Открывают XML. То, что это делает, изменить оттенок пикселей в изображении путем смещения оттенка. Требуется 2 параметра: 1) hue
(в градусах) и 2) amt
(сумма, процент). Это - № 2, с которым у меня есть проблемы. Состояния спецификации:
Оттенок: значения цвета эффекта Сдвигов или к или далеко от оттенка указанной суммой.
- количество (Сумма) - Указывает тем, насколько значение цвета смещается.
- оттенок (Оттенок) - Указывает оттенок, к которому можно окрасить.
Не беря в голову конструкцию XML, я могу эмулировать значения, которые имеют amt
из 100%. Так, например, если я хочу Синий (оттенок: 240 °), я могу создать это (Крашеное). Вот пример:
Исходный и крашеный (оттенок = 240, сумма = 100%).
Это достигается просто путем установки оттенка на 240, сохранения насыщенности и яркости тем же и преобразования в RGB и записи каждого пикселя.
Вот то, чего я не могу достигнуть хотя:
(Синий) Hue=240, Сумма = 30%, 50% и 80%, соответственно
Снова, спецификация для Amount
говорит Указывает тем, насколько значение цвета смещается. Я попробовал все виды путей здесь, чтобы заставить это работать, но не могу казаться (hue=hue*amount
, originalhue * amount + hue
, и т.д.)
Больше примеров: (зеленый) Hue=120, Сумма = 30%, 50%, 80% и 100%, соответственно. 100% один я могу добраться.
Вот некоторые списки значения единственного пикселя в изображениях выше:
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
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
Так, вопрос: кто-либо знает, как это должно работать?
Примечание: Это не дубликат:
- Изменение оттенка битового массива при сохранении общей яркости
- Поверните использование Оттенка ImageAttributes в C#
- ... или что-либо еще я мог найти на ТАК
Я совершенно уверен, что ваша проблема возникает из-за того, как вы интерполируете углы. Вот функция интерполяции (написанная на языке 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: Насколько я понимаю, ваша цель - повернуть исходный оттенок в сторону определенного целевого оттенка на некоторую заданную величину. Я уверен, что вы уже знакомы с этим, но для наглядности вот цветовой круг.
(источник: 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)
Я предполагаю, что второй результат - тот, который вы ищете, но я могу ошибаться, и ошибка может быть в другом месте...
Вы должны взглянуть на TintParams в GDI+ (хотя и не является частью .NET) - это может быть именно то, что вы ищете.