Это относительно просто, если вы умны в вопросах, связанных с производительностью.Палитры цветов - это одно из моих любимых колес, которое можно заново реализовать, когда мне скучно или я чувствую себя креативно.
Вы можете нарисовать точку в одном пикселе, используя значение ARGB, используя метод SetPixel
Bitmap
класс .Цикл на каждом пикселе нового Bitmap
объекта соответствующего размера и установка соответствующего цвета - это самый простой способ сделать это.Если вы сделаете это один раз при открытии палитры цветов и кешируете растровый объект в переменную уровня класса, перекрашивая его в элемент управления при необходимости вместо перерисовки каждый раз, производительность будет вполне респектабельной.
В противном случае SetPixel
является самым медленным способом рисования растрового изображения, которое только можно представить.Существуют приемы для его ускорения, такие как блокировка растрового изображения и / или добавление в нативный код, но они не упрощают процесс .Что значительно упростит ваш код и даже обеспечит небольшое повышение производительности, так это использование кисти градиента для рисования.Graphics
класс очень хорошо инкапсулирует функциональность рисования GDI +, и создание LinearGradientBrush
объекта для рисования
довольно просто.
Что касается вашего второго вопроса, каковы диапазоны значений, которые вам нужно использовать, то первым делом нужно понимать цветовые модели, которые вы хотите представить в своем палитре цветов.Возможно, наиболее распространены и просты в работе два варианта: RGB и HSV (также известный как HSB; HSL - это нечто совершенно иное).
Цветовое пространство RGB, один цвет представлен значениями его компонентов красного, зеленого и синего цветов.Стандартная шкала представляет эти значения от 0 (минимум) до 255 (максимум).Белый представлен как (255, 255, 255), а черный представлен как (0, 0, 0).Поскольку это естественное цветовое пространство для мониторов, многие графические программы используют его.Конечно, это не очень интуитивно понятно для людей , которым трудно понять, как именно выразить, скажем, оранжевый, фиолетовый или коричневый в модели RGB.
Скорее, модель HSVгораздо более интуитивно понятен, и обычно тот, который вы видите, используется для рисования причудливых цветных сеток / градиентов.Эта модель используется (по умолчанию) в палитре цветов Photoshop, которая, пожалуй, самая известная из всех:
![Adobe Photoshop Color Picker](https://i.stack.imgur.com/ysjMN.jpg)
В HSV цвет представлен тремя значениями атрибутов:оттенок, насыщенность и значение (или яркость).
Атрибуты насыщенности и значения часто рассматриваются как проценты в диапазоне от 0 до 100 (хотя они действительно могут быть представлены любым диапазоном значений).
Насыщенность описывает расстояние цвета от центра круга.Цвета на краю круга полностью насыщены (100), а цвета к центру - ненасыщенные (белый или 0).
![Saturation](https://i.stack.imgur.com/37aZG.gif)
Значение (или яркость) интуитивно понятно.Максимально полное значение яркого цвета равно 100, а минимальное значение яркости - 0 (черный).
![Value](https://i.stack.imgur.com/sWv4o.gif)
С момента ответауже давно, я покажу вам пару примеров реализации палитр цветов, уже доступных в Интернете, вместо того, чтобы объяснять пошагово здесь: