Math 如何计算两种颜色之间的差异(光度、亮度、颜色)?
我怎么计算呢Math 如何计算两种颜色之间的差异(光度、亮度、颜色)?,math,colors,brightness,Math,Colors,Brightness,我怎么计算呢 亮度对比度 亮度的差异,以及 色差 在两种给定颜色之间 示例: 输入 颜色1:#99ccff 颜色2:#225588 输出 亮度对比度:4.57:1 亮度差:119 色差:357 将每种颜色从(R、G、B)坐标转换为(H、S、V)[或(H、S、L)]。你可以找到公式 我已经为此编写了Pascal函数: function RGBToHSV(const Color: TRGB): THSV; var cmax, cmin, cdiff: real; begin cma
- 亮度对比度
- 亮度的差异,以及
- 色差
- 颜色1:#99ccff
- 颜色2:#225588
- 亮度对比度:4.57:1
- 亮度差:119
- 色差:357 将每种颜色从(R、G、B)坐标转换为(H、S、V)[或(H、S、L)]。你可以找到公式 我已经为此编写了Pascal函数:
function RGBToHSV(const Color: TRGB): THSV;
var
cmax, cmin, cdiff: real;
begin
cmax := MaxComponent(Color);
cmin := MinComponent(Color);
cdiff := cmax - cmin;
with Color, result do
begin
// Hue
if cmax = cmin then
hsvHue := 0
else if cmax = rgbRed then
hsvHue := (60 * (rgbGreen - rgbBlue) / cdiff)
else if cmax = rgbGreen then
hsvHue := (60 * (rgbBlue - rgbRed) / cdiff) + 120
else
hsvHue := (60 * (rgbRed - rgbGreen) / cdiff) + 240;
hsvHue := Fix360(hsvHue);
// Saturation
if cmax = 0 then
hsvSaturation := 0
else
hsvSaturation := 1 - cmin / cmax;
// Value
hsvValue := cmax;
end;
end;
function RGBToHSL(const Color: TRGB): THSL;
var
cmax, cmin, cdiff, csum: real;
begin
cmax := MaxComponent(Color);
cmin := MinComponent(Color);
cdiff := cmax - cmin;
csum := cmax + cmin;
with Color, result do
begin
// Hue
if cmax = cmin then
hslHue := 0
else if cmax = rgbRed then
hslHue := (60 * (rgbGreen - rgbBlue) / cdiff)
else if cmax = rgbGreen then
hslHue := (60 * (rgbBlue - rgbRed) / cdiff) + 120
else
hslHue := (60 * (rgbRed - rgbGreen) / cdiff) + 240;
hslHue := Fix360(hslHue);
// Saturation
if cmax = cmin then
hslSaturation := 0
else if csum <= 1 then
hslSaturation := cdiff / csum
else
hslSaturation := cdiff / (2 - csum);
// Lightness
hslLightness := csum / 2;
end;
end;
函数RGBToHSV(常量颜色:TRGB):THSV;
变量
cmax、cmin、cdiff:真实值;
开始
cmax:=最大分量(颜色);
cmin:=最小成分(颜色);
cdiff:=cmax-cmin;
用颜色,结果如何
开始
//色调
如果cmax=cmin,则
hsvHue:=0
否则,如果cmax=rg,则
hsvHue:=(60*(绿色-绿色)/cdiff)
否则,如果cmax=rgbGreen,则
hsvHue:=(60*(rgbBlue-rgbreed)/cdiff)+120
其他的
hsvHue:=(60*(rgbGreen-rgbGreen)/cdiff)+240;
hsvHue:=Fix360(hsvHue);
//饱和
如果cmax=0,则
hs饱和度:=0
其他的
hs饱和度:=1-cmin/cmax;
//价值观
hsv值:=cmax;
结束;
结束;
功能RGBToHSL(恒定颜色:TRGB):THSL;
变量
cmax、cmin、cdiff、csum:真实值;
开始
cmax:=最大分量(颜色);
cmin:=最小成分(颜色);
cdiff:=cmax-cmin;
csum:=cmax+cmin;
用颜色,结果如何
开始
//色调
如果cmax=cmin,则
hslHue:=0
否则,如果cmax=rg,则
hslHue:=(60*(rgbGreen-rgbBlue)/cdiff)
否则,如果cmax=rgbGreen,则
hslHue:=(60*(rgbBlue-rgbreed)/cdiff)+120
其他的
hslHue:=(60*(rgbGreen-rgbGreen)/cdiff)+240;
hslHue:=Fix360(hslHue);
//饱和
如果cmax=cmin,则
hsl饱和度:=0
否则,如果csum将每种颜色从(R、G、B)坐标转换为(H、S、V)[或(H、S、L)]。你可以找到公式
我已经为此编写了Pascal函数:
function RGBToHSV(const Color: TRGB): THSV;
var
cmax, cmin, cdiff: real;
begin
cmax := MaxComponent(Color);
cmin := MinComponent(Color);
cdiff := cmax - cmin;
with Color, result do
begin
// Hue
if cmax = cmin then
hsvHue := 0
else if cmax = rgbRed then
hsvHue := (60 * (rgbGreen - rgbBlue) / cdiff)
else if cmax = rgbGreen then
hsvHue := (60 * (rgbBlue - rgbRed) / cdiff) + 120
else
hsvHue := (60 * (rgbRed - rgbGreen) / cdiff) + 240;
hsvHue := Fix360(hsvHue);
// Saturation
if cmax = 0 then
hsvSaturation := 0
else
hsvSaturation := 1 - cmin / cmax;
// Value
hsvValue := cmax;
end;
end;
function RGBToHSL(const Color: TRGB): THSL;
var
cmax, cmin, cdiff, csum: real;
begin
cmax := MaxComponent(Color);
cmin := MinComponent(Color);
cdiff := cmax - cmin;
csum := cmax + cmin;
with Color, result do
begin
// Hue
if cmax = cmin then
hslHue := 0
else if cmax = rgbRed then
hslHue := (60 * (rgbGreen - rgbBlue) / cdiff)
else if cmax = rgbGreen then
hslHue := (60 * (rgbBlue - rgbRed) / cdiff) + 120
else
hslHue := (60 * (rgbRed - rgbGreen) / cdiff) + 240;
hslHue := Fix360(hslHue);
// Saturation
if cmax = cmin then
hslSaturation := 0
else if csum <= 1 then
hslSaturation := cdiff / csum
else
hslSaturation := cdiff / (2 - csum);
// Lightness
hslLightness := csum / 2;
end;
end;
函数RGBToHSV(常量颜色:TRGB):THSV;
变量
cmax、cmin、cdiff:真实值;
开始
cmax:=最大分量(颜色);
cmin:=最小成分(颜色);
cdiff:=cmax-cmin;
用颜色,结果如何
开始
//色调
如果cmax=cmin,则
hsvHue:=0
否则,如果cmax=rg,则
hsvHue:=(60*(绿色-绿色)/cdiff)
否则,如果cmax=rgbGreen,则
hsvHue:=(60*(rgbBlue-rgbreed)/cdiff)+120
其他的
hsvHue:=(60*(rgbGreen-rgbGreen)/cdiff)+240;
hsvHue:=Fix360(hsvHue);
//饱和
如果cmax=0,则
hs饱和度:=0
其他的
hs饱和度:=1-cmin/cmax;
//价值观
hsv值:=cmax;
结束;
结束;
功能RGBToHSL(恒定颜色:TRGB):THSL;
变量
cmax、cmin、cdiff、csum:真实值;
开始
cmax:=最大分量(颜色);
cmin:=最小成分(颜色);
cdiff:=cmax-cmin;
csum:=cmax+cmin;
用颜色,结果如何
开始
//色调
如果cmax=cmin,则
hslHue:=0
否则,如果cmax=rg,则
hslHue:=(60*(rgbGreen-rgbBlue)/cdiff)
否则,如果cmax=rgbGreen,则
hslHue:=(60*(rgbBlue-rgbreed)/cdiff)+120
其他的
hslHue:=(60*(rgbGreen-rgbGreen)/cdiff)+240;
hslHue:=Fix360(hslHue);
//饱和
如果cmax=cmin,则
hsl饱和度:=0
否则,如果csum我似乎记得这样的事情((红色数值1*299+绿色数值1*587+蓝色数值1*114)/(红色数值2*299+绿色数值2*587+蓝色数值2*114))@anirudh4444:例如,结果是2.57490315。。。看起来不像任何预期的输出。这算什么?你知道这些神奇的数字是从哪里来的吗?我似乎记得这样的事情((红色数值1*299+绿色数值1*587+蓝色数值1*114)/(红色数值2*299+绿色数值2*587+蓝色数值2*114))@anirudh4444:例如,结果是2.57490315。。。看起来不像任何预期的输出。这算什么?知道这些神奇的数字是从哪里来的吗?我还发现了thins link(不需要知道Pascal):@Shawn:嗯,Pascal非常可读,非常类似于高等数学书中描述算法时使用的“伪语言”…Rajbrand:是的,它非常好。我只是不理解的颜色、结果do
和Fix360
部分,所以我最终不得不在其他地方查找..我还找到了thins链接(不需要知道Pascal):@Shawn:嗯,帕斯卡的可读性很强,与高等数学书中描述算法时使用的“伪语言”非常相似……拉杰布兰德:是的,非常好。我只是不理解中的颜色、结果do
和Fix360
部分,所以我最终不得不在别处查找。。