给定背景颜色,如何获得使其在背景颜色上可读的前景色?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定背景颜色,如何获得使其在背景颜色上可读的前景色?相关的知识,希望对你有一定的参考价值。
给定背景颜色,如何获得使其在背景颜色上可读的前景色?
我的意思是在程序中自动计算前景色。
或者简化问题,如果从白/黑中选择前景色,如何在程序中进行选择?
最安全的做法是遵守万维网联盟(W3C)Web内容可访问性指南2.0,它指定了亮度contrast ratio of 4.5:1 for regular text (12 pt or smaller), and 3.0:1 for large text。对比度定义为:
[Y(b)+ 0.05] / [Y(d)+ 0.05]
其中Y(b)是较亮颜色的亮度(亮度),Y(d)是较暗颜色的亮度。
您可以通过首先将每个颜色的RGB值转换为伽马调整的标准化rgb值来计算亮度Y:
- r =(R / 255)^ 2.2
- b =(B / 255)^ 2.2
- g =(G / 255)^ 2.2
然后使用sRGB常量(四舍五入到4位)组合它们:
Y = 0.2126 * r + 0.7151 * g + 0.0721 * b
这使得白色Y为1,黑色Y为0,因此最大可能对比度为(1.05 / 0.05)= 21(在舍入误差范围内)。
或者let JuicyStudio do the math为你。
该计算假定在相对昏暗的房间(或者如果他或他必须用户可以使暗淡的房间)的标准性监视器。这使它适合家庭或办公室使用,但我不知道它是否适合移动应用程序或户外使用的其他设备。
这是我在Java和javascript中所做的一个。它基于this松散地基于javascript。我从here拿了亮度配方。我眼中门槛的甜蜜点大约是140。
Java版本:
public class Color {
private float CalculateLuminance(ArrayList<Integer> rgb){
return (float) (0.2126*rgb.get(0) + 0.7152*rgb.get(1) + 0.0722*rgb.get(2));
}
private ArrayList<Integer> HexToRBG(String colorStr) {
ArrayList<Integer> rbg = new ArrayList<Integer>();
rbg.add(Integer.valueOf( colorStr.substring( 1, 3 ), 16 ));
rbg.add(Integer.valueOf( colorStr.substring( 3, 5 ), 16 ));
rbg.add(Integer.valueOf( colorStr.substring( 5, 7 ), 16 ));
return rbg;
}
public String getInverseBW(String hex_color) {
float luminance = this.CalculateLuminance(this.HexToRBG(hex_color));
String inverse = (luminance < 140) ? "#fff" : "#000";
return inverse;
}
}
Javascript版本:
这是javascript中用于前端事物的相同内容。从here获取的RGB转换:
hex_to_rgb: function(hex) {
var result = /^#?([a-fd]{2})([a-fd]{2})([a-fd]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
},
hex_inverse_bw: function(hex) {
rgb = this.hex_to_rgb(hex);
luminance = (0.2126*rgb["r"] + 0.7152*rgb["g"] + 0.0722*rgb["b"]);
return (luminance < 140) ? "#ffffff": "#000000";
}
- 计算亮度(见HSL)
- 如果亮度小于50%,请使用白色。否则,使用黑色。
使用颜色作为前景颜色很困难,因为您必须考虑对比度和色盲。
这里有一些实际的(红宝石)代码实际上会解除这些代码:
rgbval = "8A23C0".hex
r = rgbval >> 16
g = (rgbval & 65280) >> 8
b = rgbval & 255
brightness = r*0.299 + g*0.587 + b*0.114
return (brightness > 160) ? "#000" : "#fff"
您可以计算反色,但是你会冒着对比度在色彩空间“中间”缩小的风险。
以上是关于给定背景颜色,如何获得使其在背景颜色上可读的前景色?的主要内容,如果未能解决你的问题,请参考以下文章
Qt5:如何改变表格中一行的背景颜色,使其在排序时自动移动?
如何在 Mac OS X 上更改 Tkinter 按钮的前景色或背景色?