Форум: "Основная";
Текущий архив: 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