Algorithm 一种选择类似于浅色的深色的算法
我正在聊天,用户可以选择自己喜欢的文本颜色。同一聊天记录将显示在网站的多个位置。在某些地方,背景是黑色的,而在另一些地方,背景是浅色的。因此,大多数选定的颜色在某些聊天框中可能难以辨认 因此,我正在寻找一种算法,给定一种颜色在一种类型的背景(浅或暗)上效果很好,产生另一种颜色,这种颜色在相反类型的背景上看起来很好,并且尽可能与第一种颜色相似(因此用户得到的印象是,他在任何地方都使用相同的颜色) 我知道这可能不可能做到完美,但欢迎任何尝试。调查Algorithm 一种选择类似于浅色的深色的算法,algorithm,colors,Algorithm,Colors,我正在聊天,用户可以选择自己喜欢的文本颜色。同一聊天记录将显示在网站的多个位置。在某些地方,背景是黑色的,而在另一些地方,背景是浅色的。因此,大多数选定的颜色在某些聊天框中可能难以辨认 因此,我正在寻找一种算法,给定一种颜色在一种类型的背景(浅或暗)上效果很好,产生另一种颜色,这种颜色在相反类型的背景上看起来很好,并且尽可能与第一种颜色相似(因此用户得到的印象是,他在任何地方都使用相同的颜色) 我知道这可能不可能做到完美,但欢迎任何尝试。调查 只要你保持色调和饱和度不变,它看起来就会是相同的颜色
只要你保持色调和饱和度不变,它看起来就会是相同的颜色,你可以利用亮度与背景形成对比,例如,使较暗的颜色将RGB分量乘以0.5或0.75
按相同的因子缩放RGB值,可以在不改变色调的情况下使颜色更暗或更亮 好的,在读了一些关于这里和那里的东西之后。以下是我到目前为止能找到的
首先,我想强调几点,并确保阅读我答案的任何人都能够理解我在这里所说的内容 什么是颜色空间? 可以通过颜料的原色创建一系列颜色,然后这些颜色定义特定的颜色空间。颜色空间,也称为颜色模型(或颜色系统),是一个抽象的数学模型,它简单地将颜色范围描述为数字元组,通常为3或4个值或颜色分量(例如:RGB)。从根本上说,色彩空间是对坐标系和子空间的细化。系统中的每种颜色都由一个点表示
我们大多数开发人员使用以下颜色空间之一(HEX,RGB,RGBA),有些甚至会使用(CMYK,HSV,HSL,等)通过主色组合(红色,绿色,蓝色,阿尔法),可以为您提供所需的任何颜色 如果我们想知道一种颜色是否接近另一种颜色,我们就用眼睛看它,但既然我们想让计算机以编程的方式为我们做这件事,那么我们就必须用数学的方式看它 考虑到颜色A在HEX颜色空间FF0000中是红色的,而颜色B在HEX颜色空间中也是绿色的,根据我们对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. ║
╚═══════════════╩════════════════════════════════════════╝