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.
Приятной работы.