Тема, о которой сегодня пойдет речь, работа с RGB цветом. И не смотря на то, что, на практике применять подобные знания приходится достаточно редко (если только вас не попросят написать какой-нибудь графический редактор), подобные знания не для кого не окажутся лишними. Мы рассмотрим несколько функций, которые позволят нам установить нужный цвет, получить цвет любого пикселя на экране, сохранить значение цвета в текстовом виде и загрузить его обратно, а также посмотрим как перевести цвет в формат HTML и OpenGL.
Вообще цветовых палитр достаточно много, однако если речь идет о компьютере, то, скорее всего, имеется в виду именно RGB. (Для справки, палитра CKMY, используемая при выводе цветного изображения на принтер для печати, используется в полиграфии. Основные ее цвета - желтый, синий и красный, черный цвет, также присутствующий в этой палитре, играет вспомогательную роль, и является корректирующим цветом). Как видно из названия, основные цвета этой палитры - красный, зеленый и синий. Смешивая эти цвета в различных пропорциях, получают другие цвета и их оттенки. Например, чтобы получить желтый цвет, нужно взять красный и зеленый цвета, и не брать синий. Каждый цвет может иметь разную степень насыщенности - от 0 до 255 (это составляет 1 бит). 0 соответствует минимальной насыщенности, 255 - соответственно максимальной.
После краткого вступления перейдем к тому, что нам нравится больше всего, к программированию. Бросим на форму 3 TrackBar"а, меняя положение ползунков которых, мы будем менять насыщенность каждого цвета, составляющего палитру RGB. Для того чтобы преобразовать эти значения в цвет типа TColor, воспользуемся функцией RGB. Получившимся цветом будем окрашивать панель, играющую в нашем случае роль монитора.
procedure TForm1.SetMomitorColor; begin PanelMonitor.Color:= RGB(TrackRValue.Position, TrackGValue.Position, TrackBValue.Position); end; |
Процедура MoveLabel (приведенная ниже), как следует из названия, перемещает Label таким образом, что центр Label всегда находится точно под ползунком. В качестве параметров передаем сами компоненты, что делает процедуру универсальной для всех TrackBar"ов. Следующая строка устанавливает цвет текста в соответствии с текущей насыщенностью цвета палитры RGB, за который отвечает соответствующий TrackBar. Последняя процедура представляет текущий цвет в различных форматах (рассмотрим это позднее).
Представление цветов в различных форматах. В формате HTML цвет можно задать несколькими способами. Например, используя уже знакомую процедуру RGB. Но можно указать цвет и в шестнадцатеричном формате (с моей точки зрения это гораздо удобнее), и выглядит это следующим образом: #RGB. Здесь R, G, B - значения соответствующих цветов в шестнадцатеричном формате (например, #FF0000 - красный цвет, #00FF00 - зеленый цвет, #0000FF - соответственно красный). Цвет в OpenGL задается в диапазоне от 0 до 1 для каждой составляющей цвета, где 0 - минимальная насыщенность цвета (соответствует 0 в Delphi), а 1 - макcимальная насыщенность цвета (соответствует 255 в Delphi). По этому текущее значение каждой составляющей цвета необходимо разделить на 255. Также Delphi позволяет перевести цвет типа TColor в строку, используя функцию ColorToString(Color: TColor): string (перевести строку обратно в TColor можно функцией StringToColor(const S: string): TColor).
procedure TForm1.FormatColor; begin // Покажем результат работы функции ColorToString LabelColorValue.Caption:= "Результат работы функции ColorToString = " + ColorToString(RGB(TrackRValue.Position, TrackGValue.Position, TrackBValue.Position)); // Покажем значение цвета в формате HTML LabelColorHTML.Caption:= Format("Значение цвета в формате HTML = #%.2x%.2x%.2x", ); // Покажем значение цвета в формате OpenGL LabelColorOpenGL.Caption:= Format("Значение цвета в формате OpenGL = R(%.5f) G(%.5f) B(%.5f)", ); end; |
И последнее. Для изменения режимов работы программы (ручная установка цвета / автоматическое определение цвета), бросим на форму CheckBox, который будет включать/выключать таймер.
procedure TForm1.CheckClick(Sender: TObject); begin TrackRValue.Enabled:= not Check.Checked; TrackGValue.Enabled:= not Check.Checked; TrackBValue.Enabled:= not Check.Checked; Timer.Enabled:= Check.Checked; end; |
Компонент Delphi ColorDialog (диалог выбора цвета) располагается на вкладке Dialog Палитры Компонентов. C его помощью можно задать цвет любого визуального компонента.
Выбор цвета осуществляется с помощью диалогового окна, показанного выше. Первоначально окно состоит из левой половины и мы можем выбрать "Основные цвета". При необходимости мы можем задать "Дополнительные цвета". Для этого нажимаем кнопку "Определить цвет" и перед нами появиться вторая, правая половина нашего диалогового окна, в котором выбрав визуально интересующий нас цвет нажимаем кнопку "Добавить в набор".
Цвет выбранный пользователем, основное свойство данного компонента, определяется свойством Color . Свойство Color можно задать на этапе проектирования в Инспекторе Объектов или же программно.
С помощью свойства CustomColors можно задать цвета дополнительной палитры. Цвета задаются строками:
порядковый номер цвета = шестнадцатеричное представление цвета;
порядковый номер цвета - ColorA (первый цвет) и далее до СщдщкЗ(последний шестнадцатый цвет). Для примера строка
задаст первый цвет и он будет серый .
Свойство Options состоит из следующего множества опций:
Первоначально все опции отключены.
Для примера расположим на форме компонент Edit и кнопку Button, а также сам компонент ColorDialog, как показано на рисунке. Нажав на кнопку мы будем вызывать диалог выбора цвета и задавать цвет фона компонента Edit.
Обработчик кнопки будет таким:
Procedure TForm1.Button1Click(Sender: TObject); begin if ColorDialog1.Execute then edit1.Color:= ColorDialog1.Color; end;
Итог: мы познакомились с компонентом ColorDialog и его применением в приложении.