用于选择类似于浅色的深色的算法

我正在聊天,用户可以选择自己喜欢的文字颜色。 同一个聊天会显示在网站的几个地方。 在某些地方,背景会变暗,而在其他地方 - 光线会变暗。 因此,大多数选择的颜色可能在某些聊天框中难以辨认。

所以我正在寻找一种算法,如果一种颜色适用于某种背景(光线或黑暗),可以生成另一种颜色,该颜色在相反类型的背景下看起来不错,并且与第一种颜色尽可能相似(所以用户会得到他在各处使用相同颜色的印象)。

我知道这可能无法做到完美,但任何尝试都是值得欢迎的。


看看http://en.wikipedia.org/wiki/HSL_and_HSV

只要你保持色调和饱和度不变,它看起来就是相同的颜色,你可以用亮度来对比背景


例如,为了使颜色更深,可以将RGB分量乘以0.5或0.75。

按照相同的因子缩放RGB值,可以在不改变色调的情况下使颜色更暗或更亮。


好吧,在阅读了这里和那里的一些事情之后。 这是我迄今能够发现的。

首先,我想强调几点,并确保任何正在阅读我的答案的人都能够理解我在这里谈论的内容。

什么是色彩空间?

一系列颜色可以由颜料的原色创建,然后这些颜色定义一个特定的颜色空间。 颜色空间也称为颜色模型(或颜色系统),是一种抽象的数学模型,它简单地将颜色范围描述为数字元组,通常为3或4个值或颜色分量(例如:RGB)。 基本上说,色彩空间是坐标系和子空间的细化。 系统中的每种颜色都由一个点表示。


我们大多数人开发使用下列颜色空间之一(HEX,RGB,RGBA)有的甚至去使用(CMYK,HSVHSL ),它可以为您提供与您通过主颜色的组合想要的任何颜色红色绿色蓝色阿尔法 )。

如果我们想知道一种颜色是否接近另一种颜色,我们用我们的眼睛来看,但是由于我们希望计算机可以通过编程的方式为我们做,所以我们用数学方式来看它。

鉴于该颜色十六进制颜色空间#FF0000B色的红色十六进制颜色空间以及#00FF00,并从我们的RGB的理解,我们的有前两个值是颜色的表示,第二两个值绿绿色的表示,最后两个值是蓝色的表示,并且由于我们知道每个值都是其值(0-9)的数字表示,则(A,B,C,D, F)=(10,11,12,13,14)。 然后,我们可以绘制3D维度的颜色,并使用像欧几里得这样的规则计算它们之间的距离。

EX:A =(R1 = FF,G1 = 00,B1 = 00)
B =(R2 = 00,G2 = FF,B2 = 00)
我们在这里有两点,现在我们可以使用欧几里德法则
距离= sqrt((R2-R1)^ 2 +(G2-G1)^ 2 +(B2-B1)^ 2)

到目前为止很好,对吧?
没有

我们使用HEX,RGBA,CMYK或任何其他颜色空间,除了颜色空间中两种颜色之间的距离有时可能是完全不同的颜色,但它们之间的距离很小,因此我们无法知道任何东西不要考虑我们的眼睛如何看待颜色。

但是还有其他色彩空间( 科学色彩空间)考虑到我们的眼睛看到色彩的方式以及我们的心灵如何解读它们。 其中之一是实验室


颜色转换

一个绝对色彩空间中的颜色可以转换为另一个绝对色彩空间,并且一般情况下可以转换回来。 但是,某些色彩空间可能具有色域限制,并且转换位于该色域之外的颜色不会产生正确的结果。 也可能存在舍入误差,特别是如果使用每个组件(8位颜色)仅有256个不同值的流行范围。


什么是色域?

在包括计算机图形和照片在内的色彩再现中,色域或色域是某种完整的颜色子集。 最常见的用法是指可以在给定情况下准确表示的颜色的子集,例如在给定的色彩空间内或通过某个输出设备。


现在我们已经理解了我们要实现的基本功能,让我们开始编码,并知道下面的等式。

HEX转RGB

我们用HEX作为十六进制值的颜色表示,我们只需要得到它们的十进制值,现在我们在RGB颜色空间中有了我们的颜色。
A = RGB(255,0,0)红色
B = RGB(0,255,0)绿色

RGB到XYZ

我们必须遵循以下数学法则
颜色=当前颜色/ 255
如果颜色> 0.04045
颜色=((颜色+0.055)/1.055)^ 2.4
其他
颜色=颜色/ 12.92
颜色=彩色* 100
X = colorRed * 0.4124 + colorGreen * 0.3576 + colorBlue * 0.1805
Y = colorRed * 0.2126 + colorGreen * 0.7152 + colorBlue * 0.0722
Z = colorRed * 0.0193 + colorGreen * 0.1192 + colorBlue * 0.9505
就是这样

EX: - A = RGB(255,0,0)红色
colorRed = 255/255
colorGreen = 0/255
colorBlue = 0/255

if (colorRed > 0.04045){
    colorRed = ( ( colorRed + 0.055 ) / 1.055 ) ^ 2.4
}else{
    colorRed = colorRed / 12.92
}
if (colorGreen > 0.04045){
    colorGreen = ( ( colorGreen + 0.055 ) / 1.055 ) ^ 2.4
}else{<br/>
    colorGreen = colorGreen / 12.92
}
if (colorBlue > 0.04045){
    colorBlue = ( ( colorBlue + 0.055 ) / 1.055 ) ^ 2.4
}else{
    colorBlue = colorBlue / 12.92
}

colorRed = colorRed * 100
colorGreen = colorGreen * 100
colorBlue = colorBlue * 100

X =(colorRed * 0.4124)+(colorGreen * 0.3576)+(colorBlue * 0.1805)
Y =(colorRed * 0.2126)+(colorGreen * 0.7152)+(colorBlue * 0.0722)
Z =(colorRed * 0.0193)+(colorGreen * 0.1192)+(colorBlue * 0.9505)

XYZ(X,Y,Z)

XYZ到实验室

//参考-X,参考-Y和参考-Z指特定的光源和观察者。

X = X /参考-X
Y = Y /参考-Y
Z = Z /参考-Z

if ( X > 0.008856 ) {
    X = X ^ ( 1/3 )
}else{
    X = ( 7.787 * X ) + ( 16 / 116 )
}
if ( Y > 0.008856 ) {
    Y = Y ^ ( 1/3 )
}else{
    Y = ( 7.787 * Y ) + ( 16 / 116 )
}
if ( Z > 0.008856 ) {
    Z = Z ^ ( 1/3 )
}else{
    Z = ( 7.787 * Z ) + ( 16 / 116 )
}

CIE-L * =(116 * Y) - 16
CIE-a * = 500 *(X-Y)
CIE-b * = 200 *(Y-Z)


参考

// 2o Observer(CIE 1931)
// X2,Y2,Z2
CIE2_A = {109.850f,100f,35.585f} //白炽灯
CIE2_C = {98.074f,100f,118.232f}
CIE2_D50 = {96.422f,100f,82.521f}
CIE2_D55 = {95.682f,100f,92.149f}
CIE2_D65 = {95.047f,100f,108.883f} //日光
CIE2_D75 = {94.972f,100f,122.638f}
CIE2_F2 = {99.187f,100f,67.395f} //荧光灯
CIE2_F7 = {95.044f,100f,108.755f}
CIE2_F11 = {100.966f,100f,64.370f}

// 10o Observer(CIE 1964)
// X2,Y2,Z2
CIE10_A = {111.144f,100f,35.200f} //白炽灯
CIE10_C = {97.285f,100f,116.145f}
CIE10_D50 = {96.720f,100f,81.427f}
CIE10_D55 = {95.799f,100f,90.926f}
CIE10_D65 = {94.811f,100f,107.304f} //日光
CIE10_D75 = {94.416f,100f,120.641f}
CIE10_F2 = {103.280f,100f,69.026f} //荧光
CIE10_F7 = {95.792f,100f,107.687f}
CIE10_F11 = {103.866f,100f,65.627f}


Lap色空间中两种颜色之间的距离

将颜色视为3D维度,就像我们之前所做的那样,现在我们具有两种颜色相对于人眼的确切距离。


包括

研究更多的技术,我们应该使用这种技术来改变颜色,但是颜色相同,但是对于人类的眼睛来说感觉像是另一种颜色,通过它我们可以看到背景以及使用相同的颜色绘制的东西颜色。

链接地址: http://www.djcxy.com/p/15267.html

上一篇: An algorithm for selecting a dark color similar to a light color

下一篇: Finding "equivalent" color with opacity