![]() |
|
|
#1
|
||||
|
||||
|
Взоможно ли в delphi вместо кодировки RGB использовать RYB(red yellow blue), если да, то как это делается?
|
|
#2
|
||||
|
||||
|
Что Вы подразумеваете под словом "использовать"? и чем не устраивает RGB?
|
|
#3
|
||||
|
||||
|
RGB - это 3 основных цвета, потому что с помощью именно них ты можешь создать ЛЮБОЙ цвет, хоть желтый, хоть черный...
|
|
#4
|
||||
|
||||
|
Цитата:
RYB CMYK знаком диалог выбора цвета: ![]() Последний раз редактировалось NumLock, 15.10.2010 в 15:17. |
|
#5
|
||||
|
||||
|
Я ж не сказал, что RYB нету, я сказал, что красный, зеленый, синий - это 3 основных цвета, и с помощью них можно получить любой другой цвет.
|
|
#6
|
||||
|
||||
|
точно так же можно утверждать, что основных цвета 4: Cyan, Magenta, Yellow, Black. из которых можно сделать красный, синий, зеленый (см. ссылки). просто большинству привычней смешивать красный, синий, зеленый для получения остальных цветов. вообщем все это не по теме...
|
|
#7
|
||||
|
||||
|
Не по теме, но все же, из ссылки:
RYB — цветовая модель субтрактивного синтеза, основанная на составлении цвета из красного (англ. Red), жёлтого (англ. Yellow) и голубого (англ. Blue). Эта сложившаяся исторически система предшествовала становлению современной науки о цвете. Она не вписывается в современные представления о пиках восприятия спектра видимого света в трехстимульной модели зрения, однако все еще применяется для представления цвета в изобразительном искусстве. А в веб дизайне, программировании используют rgb, вот и все... |
|
#8
|
||||
|
||||
|
Цитата:
Цитата:
Код:
function GetKValue(cmyk: COLORREF): Byte; begin Result := Byte(cmyk); end; function GetYValue(cmyk: COLORREF): Byte; begin Result := Byte(cmyk shr 8); end; function GetMValue(cmyk: COLORREF): Byte; begin Result := Byte(cmyk shr 16); end; function GetCValue(cmyk: COLORREF): Byte; begin Result := Byte(cmyk shr 24); end; function CMYK(c, m, y, k: Byte): COLORREF; begin Result := (k or (y shl 8) or (m shl 16) or (c shl 24)); end; |
|
#9
|
||||
|
||||
|
Код:
function RYBToRGB(R, Y, B:byte):TColor;
function cubicInt(t, A, B:single):single;
begin
Result:=A + t*t*(3-2*t)*(B-A);
end;
var iR, iY, iB, x0, x1, x2, x3, y0, y1 : single;
rR, rG, rB : byte;
begin
iR := R/255;
iY := Y/255;
iB := B/255;
x0 := cubicInt(iB, 1.0, 0.163);
x1 := cubicInt(iB, 1.0, 0.0);
x2 := cubicInt(iB, 1.0, 0.5);
x3 := cubicInt(iB, 1.0, 0.2);
y0 := cubicInt(iY, x0, x1);
y1 := cubicInt(iY, x2, x3);
rR := Round(255*cubicInt(iR, y0, y1));
x0 := cubicInt(iB, 1.0, 0.373);
x1 := cubicInt(iB, 1.0, 0.66);
x2 := cubicInt(iB, 0.0, 0.0);
x3 := cubicInt(iB, 0.5, 0.094);
y0 := cubicInt(iY, x0, x1);
y1 := cubicInt(iY, x2, x3);
rG := Round(255*cubicInt(iR, y0, y1));
x0 := cubicInt(iB, 1.0, 0.6);
x1 := cubicInt(iB, 0.0, 0.2);
x2 := cubicInt(iB, 0.0, 0.5);
x3 := cubicInt(iB, 0.0, 0.0);
y0 := cubicInt(iY, x0, x1);
y1 := cubicInt(iY, x2, x3);
rB := Round(255*cubicInt(iR, y0, y1));
Result := (rB shl 16) + (rG shl 8) + rR;
end;З.Ы. модель субстрактивная, а не аддитивная, как RGB Последний раз редактировалось KOOL, 15.10.2010 в 19:27. |
|
#10
|
||||
|
||||
|
Большое спасибо Kool!
Ты мне помог. Объясняю, почему мне приспичила такая кодировка. Неспроста в изобразительном искусстве цвета описывают через красный, жёлтый и синий. Ведь именно эти три цвета воспринимает сетчатка глаза у человека, и посредством их смешения в человеческом восприятии формируются остальные цвета. Из этих умозаключений следует, что RGB не является адекватной по отношению к человеческому восприятию (хотя, может быть, она удобнее в программировании). Поэтому я решил, что для программирования тоновой коррекции, удобной для человеческого восприятия, следовало бы использовать RYB. |
|
#11
|
||||
|
||||
|
Вот бы ещё разобраться, как эта функция работает, и сделать обратное преобразование...
|
|
#12
|
||||
|
||||
|
Я видел еще исходник, там и прямое и обратное преобразования, но он на пайтоне и на вход и выход подается оттенок (Hue), а не отдельные компоненты цвета. Если нужно вот исходник, там не сложно портировать http://code.google.com/p/grapefruit/.../grapefruit.py (1070 строка)
|
|
#13
|
||||
|
||||
|
Поизучал код. Используется трёхмерная интерполяция. Нашёл грубую ошибку. Исправил. Стало лучше. Но, увы, не идеал, не выдаёт cian. Ищу в инете способ интерполяции с учётом значений не только на углах куба, но и на дополнительных точках на рёбрах. Если получится, будет здорово.
|
|
#14
|
||||
|
||||
|
В любом случае полный спектр в RYB не получить. Такой же проблемой обладает и CMYK, который довольно похож на RYB
|
|
#15
|
||||
|
||||
|
RYB- RED YELLOW BLUE, RED=Magenta+Yellow, BLUE=Cyan+Magenta
вывод таков, что у вас не получится полноцветной картинки при такой модели. Пурпурного цвета будет в избытке. Нужен CMY. Черный цвет получится при смешивани: K=C+M+Y. Просто для полиграфии для черного сделали отдельную буковку, чтобы при печати текста и контуров не смешивать каждый раз три цвета. Т.к. полноцветная печать сложный технологический процесс. Художнику или полиграфисту, да и любому человеку CMYK более понятен, потому что действует тот же принцип что и при рисовании акварелью (C0M50Y100K0 - ораньжевый, несложно догадаться). А услышав R50G70B120 человеку далекому от компьютеной графики очень сложно в уме представить как будет выглядеть цвет. |