Создание динамического градиента для палитры цветов HSB

Я хочу создать палитру цветов в WPF/C#, аналогичную той, что я вижу в Photoshop.

альтернативный текст

Когда я перемещаю ползунок оттенка, градиент должен обновляться. Сначала я хочу знать, как создать градиент, где должны появляться отдельные цветовые точки и какие цветовые значения они должны содержать.

Вышеупомянутое может быть сложнее реализовать, поскольку градиент состоит из

  • Белый - Красный
  • Белый черный
  • Черный Красный

Я могу легко создавать отдельные градиенты, но как я могу создать такой «составной» градиент?

Более простой альтернативой является наличие 3 ползунков для значений HSB.

альтернативный текст

Когда я перемещаю один ползунок, цвета на двух других ползунках должны обновляться. Любые ссылки или советы, чтобы я начал? Мне нужно найти способ вычислить цвета на двух других ползунках, когда я перемещаю один. Например. когда я перемещаю ползунок оттенка с красного на синий, насыщенность и яркость должны обновляться, скажем, от ненасыщенного до насыщенного красного до синего и от темного до светло-красного до синего.


person Jiew Meng    schedule 05.11.2010    source источник


Ответы (3)


Насчет градиента, я думаю, вы должны нарисовать его сами. Взгляните на WriteableBitmap.

Три ползунка могут быть реализованы следующим образом:

  • Реализуйте абстрактный IMultivalueConverter, который преобразует два значения цветовых компонентов в градиентную кисть. Преобразователь просто берет значения двух компонентов цвета, создает градиент третьего неизвестного значения компонента и возвращает его.
  • Выведите три конкретных преобразователя: HSToBGradientConverter, SBToHGradientConverter, BHToSGradientConverter.
  • Привязка фона дорожек слайдера с мультипривязкой на соответствующих цветовых компонентах и ​​конвертере.
person Nicolas Repiquet    schedule 05.11.2010

http://blogs.msdn.com/b/wpfsdk/archive/2006/10/26/uncommon-dialogs--font-chooser-and-color-picker-dialogs.aspx

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

Надеюсь, поможет!

person Eric Smith    schedule 05.11.2010

Обратите внимание, что градиент на самом деле не состоит из трех перечисленных вами вещей. Ваша проблема в том, что вы все еще думаете о цветовом пространстве RGB, на которое это похоже. На самом деле весь смысл этого квадрата в том, что он представляет собой градиент от 0 насыщенности до 100% насыщенности слева направо и от 0 яркости до 100% яркости сверху вниз.

Я бы создал квадратное изображение, а затем для каждого пикселя определил, какой насыщенности и яркости он соответствует, а затем вставил этот цвет (конечно, с информацией об оттенке).

Я предполагаю, что у вас уже есть возможность конвертировать цвета HSB в цвета RGB. Если нет, это должно быть первой точкой вызова, и алгоритмы для этого должны быть легко найдены (если не кричать, и я могу их откопать).

person Chris    schedule 05.11.2010
comment
Хм, как я могу реализовать часть по созданию квадратного изображения, а затем для каждого пикселя определить, какая насыщенность и яркость, я думаю, мне понадобится более 1 градиента. Я тоже понимаю, что коробка, как вы сказали, градиент от 0 насыщенности до 100% насыщенности слева направо и от 0 яркости до 100% яркости сверху вниз. - person Jiew Meng; 13.11.2010
comment
Предполагая, что насыщенность и яркость изменяются от 0 до 1, тогда если у вас есть квадрат размером 100 на 100, то каждый сдвинутый пиксель вправо увеличивает насыщенность на 0,01, а каждый пиксель вниз увеличивает яркость на 0,01. Таким образом, каждый пиксель будет иметь оттенок H, насыщенность 0.01*x и яркость 0.01*y. затем у вас есть цвет, полностью специфичный в пространстве HSB, и, если вам нужно, чтобы это было в RGB для рендеринга, вы просто используете функцию преобразования для этого. Возможно, я что-то упускаю из-за путаницы в этом... - person Chris; 18.11.2010