Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Вниз

Как получить "оттенок цвета" из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.012 c
2-1125376577
злобная танька
2005-08-30 08:36
2005.10.09
StringGrid


2-1125124870
Intelligent[neo]
2005-08-27 10:41
2005.10.09
Фотографии из БД через Delphi


14-1124903150
Aldor
2005-08-24 21:05
2005.10.09
Ссылку на гимн Украины (mp3) кто-нибудь подскажет?


1-1127300171
WellSlava
2005-09-21 14:56
2005.10.09
SQLConnection


8-1111810698
wlf
2005-03-26 07:18
2005.10.09
Экспорт в Excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский