Практика
Работа с RGB цветом

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика


Тема, о которой сегодня пойдет речь, работа с 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;

Думаю из примера понятно, что, в качестве параметров функции RGB передаются коэффициенты красного, зеленого и синего цветов. Каждое изменение положения ползунка вызывает процедуру SetMomitorColor, так что мы можем наблюдать плавное изменение цвета. Однако это не единственная процедура, вызывающаяся движением ползунка. Посмотрим подробнее.

(* Ползунок, отвечающий за красную составляющую цвета *)
procedure TForm1.TrackRValueChange(Sender: TObject);
begin
   SetMomitorColor;
   MoveLabel( Sender as TTrackBar, LabelRValue );
   LabelRValue.Font.Color := RGB( TrackRValue.Position, 0, 0 );
   FormatColor;
end;

(* Ползунок, отвечающий за зеленую составляющую цвета *)
procedure TForm1.TrackGValueChange(Sender: TObject);
begin
   SetMomitorColor;
   MoveLabel( Sender as TTrackBar, LabelGValue );
   LabelGValue.Font.Color := RGB( 0, TrackGValue.Position, 0 );
   FormatColor;
end;

(* Ползунок, отвечающий за синюю составляющую цвета *)
procedure TForm1.TrackBValueChange(Sender: TObject);
begin
   SetMomitorColor;
   MoveLabel( Sender as TTrackBar, LabelBValue );
   LabelBValue.Font.Color := RGB( 0, 0, TrackBValue.Position );
   FormatColor;
end;

Процедура MoveLabel (приведенная ниже), как следует из названия, перемещает Label таким образом, что центр Label всегда находится точно под ползунком. В качестве параметров передаем сами компоненты, что делает процедуру универсальной для всех TrackBar'ов. Следующая строка устанавливает цвет текста в соответствии с текущей насыщенностью цвета палитры RGB, за который отвечает соответствующий TrackBar. Последняя процедура представляет текущий цвет в различных форматах (рассмотрим это позднее).

(* Вычисляем и устанавливаем новые координаты Label *)
procedure TForm1.MoveLabel(TrackBar_: TTrackBar; Label_: TLabel);
var
  Step: integer;
  Center: integer;
begin
   Label_.Caption := IntToStr( TrackBar_.Position );
   Step := ( ( TrackBar_.Width - 6 ) div ( TrackBar_.Max - TrackBar_.Min ) );
   Center := Label_.Width div 2;
   Label_.Left := TrackBar_.Left + TrackBar_.Position * Step - Center + 10;
end;

Представление цветов в различных форматах. В формате 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',
                                     [TrackRValue.Position,
                                      TrackGValue.Position,
                                      TrackBValue.Position] );
   // Покажем значение цвета в формате OpenGL
   LabelColorOpenGL.Caption := Format( 'Значение цвета в формате OpenGL = R(%.5f) G(%.5f) B(%.5f)',
                                       [TrackRValue.Position / 255,
                                        TrackGValue.Position / 255,
                                        TrackBValue.Position / 255] );
end;

Теперь о том, как узнать цвет интересующего нас пикселя на экране. В этом нам поможет функция GetPixel. Так как определить координаты пикселя "на глаз" невозможно, проще (и логичнее) получить цвет пикселя, который находится под курсором мыши. Функция GetPixel возвращает значение типа TColor, и чтобы выделить из него значения составляющих его красного, зеленого и синего цветов, нужно воспользоваться функциями GetRValue, GetGValue и GetBValue соответственно. Приведенный ниже пример продемонстрирует работу этих функций.

procedure TForm1.TimerTimer(Sender: TObject);
var 
  DC: HDC;
  Cur: TPoint;
  ColorValue: Cardinal;
begin
   DC := GetDC( 0 );
   // Получим координаты курсора
   GetCursorPos( Cur );
   // Узнаем цвет пикселя в полученных координатах
   ColorValue := GetPixel( DC, Cur.X, Cur.Y );
   // Покажем полученный цвет
   PanelMonitor.Color := ColorValue;
   // Покажем красную составляющую цвета
   TrackRValue.Position := GetRValue( ColorValue );
   // Покажем зеленую составляющую цвета
   TrackGValue.Position := GetGValue( ColorValue );
   // Покажем синюю составляющую цвета
   TrackBValue.Position := GetBValue( ColorValue );
   ReleaseDC( 0, DC );
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;

Вот и все. Надеюсь, вам не было скучно. Удачи в программировании.

.: Пример к данной статье :.


При использовании материала - ссылка на сайт обязательна