коды цветов в delphi
Colors/ru
Contents
Обзор
Преобразование значений между TColor и RGB
Модуль Graphics предосталяет следующие функции:
Преобразование типа TColor в/из строки
Функции для преобразования строк вроде «25500» или «$AA0088» или «clNavy» в TColor:
Чтобы преобразовать TColor в красивую строку, такую как «clNavy» или «$AA0002»:
Преобразование типа TColor в/из HTML-строки #rrggbb
Таблица стандартных цветов
Предусмотрено около 20 предопределенных цветовых Констант, которые совместимы с Delphi:
Цветовая константа | Описание цвета | Шестнадцатеричное представление для использования с TColor | Пример |
---|---|---|---|
clBlack | Черный | TColor($000000); | |
clMaroon | Темно-бордовый | TColor($000080); | |
clGreen | Зеленый | TColor($008000); | |
clOlive | Оливково-зеленый | TColor($008080); | |
clNavy | Темно-синий | TColor($800000); | |
clPurple | Темно-фиолетовый | TColor($800080); | |
clTeal | Сине-зеленый | TColor($808000); | |
clGray | Серый | TColor($808080); | |
clSilver | Серебристый | TColor($C0C0C0); | |
clRed | Красный | TColor($0000FF); | |
clLime | Салатовый | TColor($00FF00); | |
clYellow | Желтый | TColor($00FFFF); | |
clBlue | Синий | TColor($FF0000); | |
clFuchsia | Фуксия | TColor($FF00FF); | |
clAqua | Голубой | TColor($FFFF00); | |
clLtGray | Светло-серый | TColor($C0C0C0); | псевдоним для clSilver |
clDkGray | Темно-серый | TColor($808080); | псевдоним для clGray |
clWhite | Белый | TColor($FFFFFF); | |
clCream | Кремовый | TColor($F0FBFF); | Lazarus 1.2 и новее |
clMedGray | Средне-серый | TColor($A4A0A0); | Lazarus 1.2 и новее |
clMoneyGreen | Денежная зелень | TColor($C0DCC0); | Lazarus 1.2 и новее |
clSkyBlue | Небесно-голубой | TColor($F0CAA6); | Lazarus 1.2 и новее |
Системные цвета
Пример: clInfoBk, clInfoText
Окно подсказок в MS Windows может иметь белый фон, поэтому вышеприведенный цвет будет отображаться белым. В Linux/gtk2 это может быть металлическая текстура, поэтому вышеприведенный будет рисовать текстуру. Если вы хотите поместить какой-либо текст в это окно, вам понадобится соответствующий контрастный цвет, например, clInfoText, иначе ваш текст может быть нечитаемым для пользователя. Например:
Системный цвет clInfoBk не может использоваться для Pen.Color и Font.Color. Если вы сделаете это, результат не определен и зависит от набора виджетов и пользовательской темы. То же самое для clInfoText: он может использоваться только как Font.Color. Использование его в качестве Brush.Color может не работать. На данный момент все виджеты позволяют использовать его как Pen.Color.
Изменения темы
Когда пользователь переключает тему, системные цвета меняются. ClInfoBk может измениться с белого на синий или с цвета на текстуру. Это изменение произойдет, когда вы назначите новый дескриптор кисти. Имейте в виду, что простое присвоение Brush.Color:=clInfoBk не назначает дескриптор кисти. Дескриптор кисти назначается в процессе использования. Например:
Таблица системных цветов
Нахождение значений RGB системного цвета
Используйте функцию ColorToRGB (в модуле Graphics), чтобы определить компоненты rgb системного цвета. Эта функция определяет, является ли цвет системным цветом, и, если это так, находится ли системный цвет в цветовой гамме текущей темы. Возвращаемое значение типа Longint можно понимать как обычный цвет:
Рисование элементов соответственно теме на ваших пользовательских элементах управления
Модуль Themes предоставляет функции для рисования отдельных элементов стандартных элементов управления. Например, чтобы нарисовать знак раскрытия узла, например, TTreeView, используйте следующий код:
Работа с цветом в Delphi
В играх и графических пакетах этому байту нашли применение. Он часто указывает прозрачность, но в офисных приложениях его просто игнорируют.
Давайте попробуем научиться работать с цветом на практике, заодно и познакомимся с необходимыми функциями. Создайте новое приложение и установите на него компоненты так, как это показано на рис.
Итак, на форме три компонента TEdit. Для красного цвета компонент назовите RedEdit, ДЛЯ зеленого — GreenEdit, ну И ДЛЯ СИНвГО — BlueEdit. Так же на форме есть кнопка для смены цвета (ее имя не имеет значения) и компонент CoiorDialog, для смены цвета.
Если вы сами создаете пример, постарайтесь все разместить так, как показано на рисунке выше (ближе к правому краю), потому что слева будем рисовать квадрат.
Для события кнопки onclick пишем код, показанный в листинге:
procedure TFormi.ButtonlClick(Sender: TObj ect);
В разделе var объявлена одна переменная целого типа Longint. Это целое число размером в 4 байта, оно будет использоваться для хранения значения цвета.
В первой строке показывается ОКНО смены цвета ColorDialogl.Execute. Если пользователь не выбрал цвет (об этом говорит конструкция if not), то выполнение процедуры прерывается с помощью exit.
В следующей строке идет присвоение строке ввода RedEdit значения красной составляющей цвета. Для этого сначала используется функция GetRValue. Ей передается значение цвета в виде целого числа (переменная с). Результат—однобайтное число, которое показывает значение красной составляющей. Поскольку результат— число, то прежде чем его присваивать в строку ввода, оно должно быть преобразовано в строку. Для этого переводим его в текст с помощью знакомой нам ФУНКЦИИ IntToStr.
То же самое проделываем и с зеленым цветом в следующей строке кода. Только для получения зеленой составляющей используется функция GetGValue.
Для получения синей составляющей используется функция GetBValue. Таким образом, после выполнения всех этих действий, мы разбили 4 байта цвета из переменной с на отдельные байты по цветам и разнесли их в соответствующие строки ввода.
После этого нужно заставить окно прорисоваться с помощью вызова метода Repaint.
Для события OnPaint напишем следующий код:
procedure TForml.FormPaint(Sender: TObj ect); begin
StrToIntDef(GreenEdit.Text, 0), StrToIntDef (BlueEdit.Text,0));
Canvas.Rectangle(10,10, 250, 150);
Здесь надо проделать обратные действия — превратить три составляющих цвета из строк ввода в одно целое значение цвета. Для этого используется функция rgb (r, g, в). У этой функции три параметра, и все они целые числа.
В качестве параметров передаются значения, указанные в соответствующих строках ввода, с предварительным преобразованием их из строк в числа.
Результат преобразования цвета записываем в цвет кисти. После этого рисуется прямоугольник, у которого цвет фона будет тот, что мы выбрали.
И последнее — создадим обработчик события onchange для всех строк ввода.
У вас должны быть выделены все строки ввода серыми рамками. Теперь перейдите в объектный инспектор на вкладку Events и дважды щелкните мышью по событию onchange, чтобы создать обработчик сразу для всех выделенных компонентов. В нем напишите следующий код:
procedure TForm1.RedEditChange(Sender: TObject);
Попробуйте запустить этот пример. Теперь выберите какой-нибудь цвет, и вы увидите составляющие этого цвета. Можете даже напрямую изменять значения в строках ввода, и результат моментально будет отражаться на цвете прямоугольника.
Ну а теперь познакомимся с константами, которые уже заготовлены для основных цветов. Вы можете их реально использовать в своих программах и присваивать, как ранее это делалось в примере. Здесь не будут перечисляться все константы, потому что вы можете их сами в любой момент найти, если щелкнете в объектном инспекторе по свойству color любого компонента. Все, что вы увидите в этом списке, — это и есть константы, которые можно использовать. Этот прием довольно удобный, потому что сразу видно константу и цвет.
Здравствуйте. Вы находитесь на старом сайте и просматриваете устаревшую версию статьи.
Последняя версия статьи: здесь
Однако, если Вам так хочется. статью отсюда я удалять пока не собираюсь.
Вы ещё читаете? Вообще-то я уже написал. Сайт переезжает. Последняя версия статьи: здесь
Можно записать немного понятнее: Result:=r+256*g+65536*b;
Конечно же, существуют и обратные функции, объявленные всё в том же модуле:
function GetRValue(rgb: DWORD): Byte;
begin
Result := Byte(rgb);
end;
function GetGValue(rgb: DWORD): Byte;
begin
Result := Byte(rgb shr 8);
end;
function GetBValue(rgb: DWORD): Byte;
begin
Result := Byte(rgb shr 16);
end;
Это 16 цветов, знакомых каждому ребёнку. Далее представлена таблица этих цветов. (О колонке #RrGgBb я расскажу позже).
### | Название | Цвет | Значение | R,G,B | #RrGgBb |
clBlack | Чёрный | 0 | 0,0,0 | #000000 | |
clMaroon | Тёмно-красный | 128 | 128,0,0 | #800000 | |
clGreen | Зелёный | 32768 | 0,128,0 | #008000 | |
clOlive | Оливковый | 32896 | 128,128,0 | #808000 | |
clNavy | Тёмно-синий | 8388608 | 0,0,128 | #000080 | |
clPurple | Пурпурный | 8388736 | 128,0,128 | #800080 | |
clTeal | Стальной | 8421376 | 0,128,128 | #008080 | |
clGray | Серый | 8421504 | 128,128,128 | #808080 | |
clSilver | Серебряный | 12632256 | 192,192,192 | #C0C0C0 | |
clRed | Красный | 255 | 255,0,0 | #FF0000 | |
clLime | Ярко-зелёный | 65280 | 0,255,0 | #00FF00 | |
clYellow | Жёлтый | 65535 | 255,255,0 | #FFFF00 | |
clBlue | Синий | 16711680 | 0,0,255 | #0000FF | |
clFuchsia | Фиолетовый | 16711935 | 255,0,255 | #FF00FF | |
clAqua | Бирюзовый | 16776960 | 0,255,255 | #00FFFF | |
clWhite | Белый | 16777215 | 255,255,255 | #FFFFFF |
Здесь, пожалуй, всё должно быть понятно. Идём дальше.
Всего 4 цвета, зачем-то выделенные как особые.
### | Название | Цвет | Значение | R,G,B | #RrGgBb |
clMoneyGreen | Money Green | 12639424 | 192,220,192 | #C0DCC0 | |
clSkyBlue | Sky Blue | 15780518 | 166,202,240 | #A6CAF0 | |
clCream | Cream | 15793151 | 255,251,240 | #FFFBF0 | |
clMedGray | Medium Gray | 10789024 | 160,160,164 | #A0A0A4 |
Эти цвета можно встретить в окне приложения в различных кнопках, списках, меню и т.д. Данные цвета зависят от операционной системы и её текущих настроек. Именно поэтому они заданы отрицательными числами. Далее в таблице приведены их значения, а также цвета для стандартных тем Windows XP и Windows 7:
Delphi и цветовые пространства.
Важным аспектом для работающим с какой бы то ни было графикой кодера является работа с цветом. Как известно любая информация, включая цвет, храниться в виде чисел. Преобразовать цвет в число можно, выделив какие-то отличительные характеристики, в зависимости от этого выбора изменяется точность передаваемого цвета, то есть общее число возможных закодированных оттенков. А выбор зависит от цели использования цвета. Ничего нового программисту придумать не придется, ибо цветовых моделей (пространств) придумано уже не мало. Нужно только научиться переводить цвет из одной модели в другую, чем и займемся. Для чего это надо? Допустим нам надо изменить какую-то характеристику цвета, скажем яркость, тогда цвет удобно перегнать в HLS, изменить соответствующую характеристику и перегнать снова в рабочее пространство. Если же мы хотим сделать рисунок краснее, то тут удобно использовать RGB и так далее. Таким образом можно будет добавить стили, эффекты или что-то еще.
Итак, поговорим об представлениях цвета. В Delphi обычно используют тип TColor, являющейся BGR цветом, веб-дизайнерам ближе HTML-color и LAB. Игроделы наверняка сталкивались с GLColor и D3DColor, по сути это RGB модель с прозрачностью, в первом случае это вещественное представление, во втором целочисленное.
Нормальная цветовая схема – плоская модель цветопередачи. Красные компоненты цвета вытянуты вдоль оси Х координатной плоскости (горизонтально), а зеленые компоненты цвета вытянуты вдоль оси Y (вертикально). При таком способе представления каждому цвету соответствует определенная точка на координатной плоскости. Спектральная чистота цветов уменьшается по мере того, как вы перемещаетесь по координатной плоскости влево. Но в этой модели не учитывается яркость. Данная модель аппаратно независима, поддерживает намного больше цветов, чем способны различать современные устройства (сканеры, мониторы, принтеры) CIE XYZ построено на основе зрительных возможностей так называемого “Стандартного Наблюдателя”, то есть гипотетического зрителя, возможности которого были тщательно изучены и зафиксированы в ходе проведенных комитетом CIE длительных исследований человеческого зрения. Комитет CIE провел множество экспериментов с огромным количеством людей, предлагая им сравнивать различные цвета, а затем с помощью совокупных данных этих экспериментов построил так называемые функции соответствия цветов (color matching functions) и универсальное цветовое пространство (universal color space), в котором был представлен диапазон видимых цветов, характерный для среднестатистического человека. Функции соответствия цветов — это значения каждой первичной составляющей света, которые должны присутствовать, чтобы человек со средним зрением мог воспринимать все цвета видимого спектра
Конечно есть еще множество цветовых моделей, таких как CCY, Luv, модели Манселла и Оствальда, но они используются реже.
Коды цветов в delphi
Тема, о которой сегодня пойдет речь, работа с RGB цветом. И не смотря на то, что, на практике применять подобные знания приходится достаточно редко (если только вас не попросят написать какой-нибудь графический редактор), подобные знания не для кого не окажутся лишними. Мы рассмотрим несколько функций, которые позволят нам установить нужный цвет, получить цвет любого пикселя на экране, сохранить значение цвета в текстовом виде и загрузить его обратно, а также посмотрим как перевести цвет в формат HTML и OpenGL. После краткого вступления перейдем к тому, что нам нравится больше всего, к программированию. Бросим на форму 3 TrackBar’а, меняя положение ползунков которых, мы будем менять насыщенность каждого цвета, составляющего палитру RGB. Для того чтобы преобразовать эти значения в цвет типа TColor, воспользуемся функцией RGB. Получившимся цветом будем окрашивать панель, играющую в нашем случае роль монитора. Думаю из примера понятно, что, в качестве параметров функции RGB передаются коэффициенты красного, зеленого и синего цветов. Каждое изменение положения ползунка вызывает процедуру SetMomitorColor, так что мы можем наблюдать плавное изменение цвета. Однако это не единственная процедура, вызывающаяся движением ползунка. Посмотрим подробнее. Процедура MoveLabel (приведенная ниже), как следует из названия, перемещает Label таким образом, что центр Label всегда находится точно под ползунком. В качестве параметров передаем сами компоненты, что делает процедуру универсальной для всех TrackBar’ов. Следующая строка устанавливает цвет текста в соответствии с текущей насыщенностью цвета палитры RGB, за который отвечает соответствующий TrackBar. Последняя процедура представляет текущий цвет в различных форматах (рассмотрим это позднее). Теперь о том, как узнать цвет интересующего нас пикселя на экране. В этом нам поможет функция GetPixel. Так как определить координаты пикселя «на глаз» невозможно, проще (и логичнее) получить цвет пикселя, который находится под курсором мыши. Функция GetPixel возвращает значение типа TColor, и чтобы выделить из него значения составляющих его красного, зеленого и синего цветов, нужно воспользоваться функциями GetRValue, GetGValue и GetBValue соответственно. Приведенный ниже пример продемонстрирует работу этих функций. И последнее. Для изменения режимов работы программы (ручная установка цвета / автоматическое определение цвета), бросим на форму CheckBox, который будет включать/выключать таймер. Вот и все. Надеюсь, вам не было скучно. Удачи в программировании.
|