Показать сообщение отдельно
Старый 08.01.2012, 12:54   #1
ProgrammerForever
AnyKey`щик
 
Аватар для ProgrammerForever
 
Регистрация: 08.01.2012
Адрес: Новосибирск
Сообщений: 8
Написано 3 полезных сообщений
(для 4 пользователей)
Подмигивание Функции для преобразования RGB >> HSV

00h: Intro;
Добрый день. Вот решил поделиться первой наработкой на MP.
Эти процедуры преобазуют цвета из более удобного для человека HSV в
привычный для программиста RGB.

01h: Теория;
HSV - цветовая модель, использующая вместо удобных для техники RGB-компонент другие параметры: тон, насыщенность и яркость.
H - цвет. Может быть от 0 до 360. Задаёт общий оттенок.
S - чистота цвета. Может быть от 0 до 1. Чем S выше, тем полученный цвет насыщенней, чем меньше, тем ближе к нейтрально серому.
V - яркость. Может быть от 0 до 1. Чем ближе к 1, тем светлее оттенок.

Подробнее тут:
** http://ru.wikipedia.org/wiki/HSV_(цветовая_модель)
** http://en.wikipedia.org/wiki/HSL_and_HSV

Прототипы функций для получения RGB-компонент цвета выглядят так:
Function RFromHSV(intH,intS,intV:integer):integer;
Function GFromHSV(intH,intS,intV:integer):integer;
Function BFromHSV(intH,intS,intV:integer):integer;
, где
intH,intS,intV - исходные цвета в HSV, задаются в диапазоне [0..255]

02h: Практика;
Казалось бы, к чему такие изощрения, если есть RGB? По крайней мере, одно применение я нашёл.
Краткий алгоритм такой:
1) Получаем базовый цвет (H-компонента);
2) Рисуем фон этим цветом (H), при этом используем среднюю чистоту цвета и яркость.
3) Повышаем яркость и чистоту цвета процентов на 50. Рисуем элементы интерфейса (кнопки, например). H остаётся тем же.
4) Ещё раз повышаем яркость и чистоту цвета. Рисуем текст.

В результате получается такой эффект: при смене базового цвета остальные цвета получаются автоматически, притом смотрятся довольно гармонично, кнопки просматриваются и надписи всегда читаемы. Примерно то же самое можно наблюдать в Windows Media Player'е последних версий при смене цвета скина.
03h: Скриншоты;


04h: Код модуля:;
unit HSV2RGB;

interface

Function RFromHSV(intH,intS,intV:integer):integer;
Function GFromHSV(intH,intS,intV:integer):integer;
Function BFromHSV(intH,intS,intV:integer):integer;

implementation

Function RFromHSV(intH,intS,intV:integer):integer;
var
   intHi,intMin,intMax,intReturn:integer;
begin
{Функция для получения красной компоненты из HSV цвета}
{intH - тон. [0..255]}
{intS - насыщенность. [0..255]}
{intV - яркость. [0..255]}
{ProgrammerForever (C) 2012}
{Автор - Боев Григорий}

      intHi:=(intH/60) mod 6;
      intMin:=intV*(255-intS)/255;
      intMax:=intV;

      if (intHi=0) Then intReturn:=intMax;
      if (intHi=1) Then intReturn:=intMax-(intMax-intMin)*(intH mod 60)/60;
      if (intHi=2) Then intReturn:=intMin;
      if (intHi=3) Then intReturn:=intMin;
      if (intHi=4) Then intReturn:=intMin+(intMax-intMin)*(intH mod 60)/60;
      if (intHi=5) Then intReturn:=intMax;

      if (intReturn>255) then intReturn:=255;
      if (intReturn<0)   then intReturn:=0;
      RFromHSV:=intReturn;
end;


Function GFromHSV(intH,intS,intV:integer):integer;
var
   intHi,intMin,intMax,intReturn:integer;
begin
{Функция для получения зелёной компоненты из HSV цвета}
{intH - тон. [0..255]}
{intS - насыщенность. [0..255]}
{intV - яркость. [0..255]}
{ProgrammerForever (C) 2012}
{Автор - Боев Григорий}

      intHi:=(intH/60) mod 6;
      intMin:=intV*(255-intS)/255;
      intMax:=intV;

      if (intHi=0) Then intReturn:=intMin+(intMax-intMin)*(intH mod 60)/60;
      if (intHi=1) Then intReturn:=intMax;
      if (intHi=2) Then intReturn:=intMax;
      if (intHi=3) Then intReturn:=intMax-(intMax-intMin)*(intH mod 60)/60;
      if (intHi=4) Then intReturn:=intMin;
      if (intHi=5) Then intReturn:=intMin;

      if (intReturn>255) then intReturn:=255;
      if (intReturn<0)   then intReturn:=0;
      GFromHSV:=intReturn;
end;


Function BFromHSV(intH,intS,intV:integer):integer;
var
   intHi,intMin,intMax,intReturn:integer;
begin
{Функция для получения синей компоненты из HSV цвета}
{intH - тон. [0..255]}
{intS - насыщенность. [0..255]}
{intV - яркость. [0..255]}
{ProgrammerForever (C) 2012}
{Автор - Боев Григорий}

      intHi:=(intH/60) mod 6;
      intMin:=intV*(255-intS)/255;
      intMax:=intV;

      if (intHi=0) Then intReturn:=intMin;
      if (intHi=1) Then intReturn:=intMin;
      if (intHi=2) Then intReturn:=intMin+(intMax-intMin)*(intH mod 60)/60;
      if (intHi=3) Then intReturn:=intMax;
      if (intHi=4) Then intReturn:=intMax;
      if (intHi=5) Then intReturn:=intMax-(intMax-intMin)*(intH mod 60)/60;

      if (intReturn>255) then intReturn:=255;
      if (intReturn<0)   then intReturn:=0;
      BFromHSV:=intReturn;
end;

end.
Приятной работы.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо ProgrammerForever за это полезное сообщение:
ABTOMAT (08.01.2012), is.SarCasm (08.01.2012)