Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.09;
Скачать: CL | DM;

Вниз

Как получить "оттенок цвета" из RGB?   Найти похожие ветки 

 
kaif ©   (2005-09-14 02:21) [0]

В диалоге TColorDialog windows отображает не только компоненты цвета RGB, но и такие понятия как "оттенок", "контрастность","яркость".
Например оттенок для красного имеет значение 0, для желтого 40, зеленого 80 и так до 200 (пурпурный).

 Как получить этот оттенок программно из составляющих RGB?
 Мне нужно знать оттенок, невзирая на яркость и контрастность.


 
wnew ©   (2005-09-14 02:40) [1]

Цветовая модель YCbCr

Взаимосвязь между цветовыми пространствами YCbCr/RGB, используемая в JPEG:
Y = 0.299R + 0.587G + 0.114B
Cb = -0.1687R - 0.3313G + 0.5B + (2  в степени точность дискретизации/2)
Cr = 0.5R - 0.4187G - 0.0813B + (2  в степени точность дискретизации/2)


 
Defunct ©   (2005-09-14 03:00) [2]

wnew ©   (14.09.05 02:40) [1]

По какой из приведенных формул можно получить оттенок 0 для красного цвета? и 200 для фиолетового? Ну для начала хотя бы 0 для красного..
По второй что ли? Но вторая формула не соответствует условию [0] для зеленого будет оттенок меньше 0.

Я так понимаю kaif требуется оттенок цвета по принципу радуги - (см в yandex - КОЖЗГСФ).


 
wnew ©   (2005-09-14 03:09) [3]

Нет, я не в ту степь. Посмотрел ColorDialog и понял это:) Цветовая модель HSB:)
http://center.fio.ru/vio/vio_11/cd_site/Articles/art_1_4.htm
http://www.csa.ru/~zebra/my_visual/zvetmod.html


 
Джо ©   (2005-09-14 03:10) [4]

Может, имелась в виду схема HSB (Hue, Saturation, Brightness). Как раз Hue и есть то, что можно назвать оттенком.
Вот тут такой исходник завалялся:

Const

BrightnessKR=0.2990; BrightnessKG=0.5870; BrightnessKB=0.1140;
LABR1=+0.81866; LABG1=-0.43909; LABB1=-0.37957;
LABR2= 0.00000; LABG2=-0.81665; LABB2=+0.81665;

Type

TColorModel=(cmRGB,cmHSB);

RGBf=Record
 case TColorModel of
   cmRGB: (r,g,b: Single);
   cmHSB: (s,i,h: Single);
End;

Function ColorRGBtoHSB(C: RGBf): RGBf;
Var x,y: SIngle
Begin
result.i:=BrightnessKr*C.r+BrightnessKg*C.g+BrightnessKb*C.b;

C.r:=C.r-0.3333*result.i; C.g:=C.g-0.3333*result.i; C.b:=C.b-0.3333*result.i;
x:=LABR1*C.r+LABG1*C.g+LABB1*C.b;
y:=LABR2*C.r+LABG2*C.g+LABB2*C.b;

result.s:=sqrt(x*x+y*y);
result.h:=arcsin(y/result.s)+pi;
End;


 
Defunct ©   (2005-09-14 03:15) [5]

хорошая статейка
http://www.antula.ru/colour-rgb.htm
формул в ней нет, зато четко рассказано что такое оттенок, контрастность и яркость ;>


 
kaif ©   (2005-09-14 13:17) [6]

Всем спасибо.
Мне нужно, как выясняется, то, что называют "цветовая модель HSB".

Спасибо Джо за алгоритм. Правда мне нужен алгоритм побыстрее, без sqrt и arcsin, так как я хочу это применять при получении спектра изображения (для каждой точки) в цикле. Но все равно попробую, может смогу упростить. Точность мне не нужна. Мне достаточно получить некий дискретный континнум оттенков, скажем 16 оттенков в виде целых чисел, чтобы нормировать по грубому спектру точный спектр и выяснить наиболее употребляемые цвета в картинке в каждом из 16 оттенков.
Честно говоря я думал, что в WinAPI найдется такая быстрая функция, что-нибудь вроде RGBToHSB, но мне ничего такого не попалось :(

2 wnew ©   (14.09.05 03:09) [3]
Спасибо за ссылки! Там есть кое-что интересное и с точки зрения принципов дизайна.

2 Defunct ©   (14.09.05 03:15) [5]
В статье не совсем верно написано:
 Объединение красного, жёлтого и синего цветов приведёт к появлению чёрного цвета. Объединение красного, зелёного и синего цветов приводит к появлению белого цвета
 На самом деле при вычитании цветов (как в полиграфии) для получения черного нужно сложить пурпуный, желтый и голубой. В отношении сложения цветов (красный зеленый синий), как на мониторе, написано верно. То есть при вычитании следует использовать цвета, дополнительные к RGB.


 
Игорь Шевченко ©   (2005-09-14 13:41) [7]

kaif ©   (14.09.05 13:17) [6]


> Правда мне нужен алгоритм побыстрее, без sqrt и arcsin


// The code is based on that found (in C) on:
//
//   http:/www.r2m.com/win-developer-faq/graphics/8.html
//
// Grahame Marsh 12 October 1997
//
// Freeware - you get it for free, I take nothing, I make no promises!
//
// Please feel free to contact me: grahame.s.marsh@corp.courtaulds.co.uk
//

function HSLtoRGB (H, S, L: double): TColor;
var
 M1, M2: double;

 function HueToColourValue (Hue: double) : byte;
 var
   V : double;
 begin
   if Hue < 0 then
     Hue := Hue + 1
   else
     if Hue > 1 then
       Hue := Hue - 1;

   if 6 * Hue < 1 then
     V := M1 + (M2 - M1) * Hue * 6
   else
     if 2 * Hue < 1 then
       V := M2
     else
       if 3 * Hue < 2 then
         V := M1 + (M2 - M1) * (2/3 - Hue) * 6
       else
         V := M1;
   Result := round (255 * V)
 end;

var
 R, G, B: byte;
begin
 if S = 0 then
 begin
   R := round (255 * L);
   G := R;
   B := R
 end else begin
   if L <= 0.5 then
     M2 := L * (1 + S)
   else
     M2 := L + S - L * S;
   M1 := 2 * L - M2;
   R := HueToColourValue (H + 1/3);
   G := HueToColourValue (H);
   B := HueToColourValue (H - 1/3)
 end;

 Result := RGB (R, G, B)
end;

// Convert RGB value (0-255 range) into HSL value (0-1 values)

procedure RGBtoHSL (RGB: TColor; var H, S, L : double);

 function Max (a, b : double): double;
 begin
   if a > b then
     Result := a
   else
     Result := b
 end;

 function Min (a, b : double): double;
 begin
   if a < b then
     Result := a
   else
     Result := b
 end;

var
 R, G, B, D, Cmax, Cmin: double;
begin
 R := GetRValue (RGB) / 255;
 G := GetGValue (RGB) / 255;
 B := GetBValue (RGB) / 255;
 Cmax := Max (R, Max (G, B));
 Cmin := Min (R, Min (G, B));

// calculate luminosity
 L := (Cmax + Cmin) / 2;

 if Cmax = Cmin then  // it"s grey
 begin
   H := 0; // it"s actually undefined
   S := 0
 end else begin
   D := Cmax - Cmin;

// calculate Saturation
   if L < 0.5 then
     S := D / (Cmax + Cmin)
   else
     S := D / (2 - Cmax - Cmin);

// calculate Hue
   if R = Cmax then
     H := (G - B) / D
   else
     if G = Cmax then
       H  := 2 + (B - R) /D
     else
       H := 4 + (R - G) / D;

   H := H / 6;
   if H < 0 then
     H := H + 1
 end
end;


 
MBo ©   (2005-09-14 13:41) [8]

>kaif ©   (14.09.05 13:17) [6]
Загляни в модуль GraphUtils.pas


 
fellix   (2005-09-14 13:51) [9]

TColorDialog использует не HSB, а HLS-модель.
В WinAPI есть функции ColorRGBToHLS и ColorHLSToRGB (доступны при установленном IE5 и выше; http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/shlwapi/gdi/palette.as p ).


 
kaif ©   (2005-09-16 00:58) [10]

2 Игорь Шевченко ©   (14.09.05 13:41) [7]
Спасибо, Игорь! Очень интересный код.

2 MBo ©   (14.09.05 13:41) [8]
Спасибо, посмотрю.

2 fellix   (14.09.05 13:51) [9]
К сожалению ссылка не работает (не находит эту функцию).
В Win32 SDK Help  я ее что-то тоже не вижу. Но буду искать. Возможно это самое быстрое решение (если найду).

Да, нашел ее прототип в модуле GraphUtils!!!
Спасибо всем.
Видимо этого мне уже достаточно. Попробую все варианты и выберу наибыстрейший.


 
Джо ©   (2005-09-16 02:07) [11]


> [6] kaif ©   (14.09.05 13:17)
> Спасибо Джо за алгоритм.

На всякий случай, если кто не понял, говорю, что он, как и код не мой. Откуда-то с Тырнетовских просторов. Автора не знаю.
(А то еще появится возмущенный автор :)



Страницы: 1 вся ветка

Текущий архив: 2005.10.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.038 c
14-1126770987
Slider007
2005-09-15 11:56
2005.10.09
Вопрос по политике безопасности Windows


1-1127203933
_BIM
2005-09-20 12:12
2005.10.09
Подскажите как создать каталог.


2-1125117243
Alex7
2005-08-27 08:34
2005.10.09
Переменный оператор


1-1126797235
Alex Kryuchkov
2005-09-15 19:13
2005.10.09
Программное создание макроса в Экселе


14-1127051675
Piter
2005-09-18 17:54
2005.10.09
Сам себе ДиДжей :)