Algorithm 一种选择类似于浅色的深色的算法

Algorithm 一种选择类似于浅色的深色的算法,algorithm,colors,Algorithm,Colors,我正在聊天,用户可以选择自己喜欢的文本颜色。同一聊天记录将显示在网站的多个位置。在某些地方,背景是黑色的,而在另一些地方,背景是浅色的。因此,大多数选定的颜色在某些聊天框中可能难以辨认 因此,我正在寻找一种算法,给定一种颜色在一种类型的背景(浅或暗)上效果很好,产生另一种颜色,这种颜色在相反类型的背景上看起来很好,并且尽可能与第一种颜色相似(因此用户得到的印象是,他在任何地方都使用相同的颜色) 我知道这可能不可能做到完美,但欢迎任何尝试。调查 只要你保持色调和饱和度不变,它看起来就会是相同的颜色

我正在聊天,用户可以选择自己喜欢的文本颜色。同一聊天记录将显示在网站的多个位置。在某些地方,背景是黑色的,而在另一些地方,背景是浅色的。因此,大多数选定的颜色在某些聊天框中可能难以辨认

因此,我正在寻找一种算法,给定一种颜色在一种类型的背景(浅或暗)上效果很好,产生另一种颜色,这种颜色在相反类型的背景上看起来很好,并且尽可能与第一种颜色相似(因此用户得到的印象是,他在任何地方都使用相同的颜色)

我知道这可能不可能做到完美,但欢迎任何尝试。

调查


只要你保持色调和饱和度不变,它看起来就会是相同的颜色,你可以利用亮度与背景形成对比,例如,使较暗的颜色将RGB分量乘以0.5或0.75


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

好的,在读了一些关于这里和那里的东西之后。以下是我到目前为止能找到的

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

什么是颜色空间?

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


我们大多数开发人员使用以下颜色空间之一(HEXRGBRGBA),有些甚至会使用(CMYKHSVHSL等)通过主色组合(红色绿色蓝色阿尔法),可以为您提供所需的任何颜色

如果我们想知道一种颜色是否接近另一种颜色,我们就用眼睛看它,但既然我们想让计算机以编程的方式为我们做这件事,那么我们就必须用数学的方式看它

考虑到颜色AHEX颜色空间FF0000中是红色的,而颜色BHEX颜色空间中也是绿色的,根据我们对RGB的理解,前两个值是红色颜色的表示,后两个值是绿色颜色的表示,后两个值是蓝色
颜色的表示,因为我们知道每一个值都是其值(0-9)的数字表示,那么(a,B,C,D,F)=(10,11,12,13,14). 然后我们可以在三维空间中绘制颜色,并使用欧几里得定律计算它们之间的距离

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

到目前为止还不错,对吧?

威瑟尔:我们使用了十六进制、RGBA、CMYK或任何其他颜色空间。除了颜色空间中两种颜色之间的距离,我们什么都不知道。这两种颜色之间的距离有时可能完全不同,但它们之间的距离很低,因为它们没有考虑我们的眼睛如何看待颜色

但是还有其他的颜色空间(科学的空间),考虑到我们的眼睛看颜色的方式以及我们的大脑如何解释颜色。其中一个是实验室


颜色变换

通常,一个绝对颜色空间中的颜色可以转换为另一个绝对颜色空间,然后再转换回来;但是,某些颜色空间可能有色域限制,并且转换位于该色域之外的颜色将不会产生正确的结果。也可能存在舍入错误,尤其是如果使用每个组件(8位颜色)仅256个不同值的流行范围


什么是色域?

在色彩复制中,包括计算机图形学和摄影,色域或色域是色彩的一个完整子集。最常见的用法是指在给定的环境中,例如在给定的颜色空间内或通过特定的输出设备,可以准确表示的颜色子集


现在我们了解了我们将要实现的基本功能,让我们开始编码,了解以下等式

十六进制到RGB

我们有十六进制作为十六进制值的颜色表示,我们只需要得到它们的十进制值,现在我们有了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=红色*0.4124+绿色*0.3576+蓝色*0.1805
Y=红色*0.2126+绿色*0.7152+蓝色*0.0722
Z=colorRed*0.0193+colorGreen*0.1192+colorBlue*0.9505
就这样

例:- A=RGB(255,0,0)红色
上校
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
}
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 )
}
╔═══════════════╦════════════════════════════════════════╗
║ Delta E Value ║               Perception               ║
╠═══════════════╬════════════════════════════════════════╣
║ <= 1.0        ║ Not perceptible by human eyes.         ║
║ 1 - 2         ║ Perceptible through close observation. ║
║ 2 - 10        ║ Perceptible at a glance.               ║
║ 11 - 49       ║ Colors are more similar than opposite. ║
║ 100           ║ Colors are exact opposite.             ║
╚═══════════════╩════════════════════════════════════════╝