有没有办法判断HTML十六进制颜色是浅还是暗

时间:2011-01-13 11:51:45

标签: java html jsp

如果背景颜色为白色,如果背景为白色,我希望html页面上的字体颜色变为黑色

我在我的页面中使用了jsp。有没有办法说出这样的话

如果颜色< ## 0686FF然后fontcolour =#000000例如

编辑:寻找scriptlet或javascript

5 个答案:

答案 0 :(得分:11)

此解决方案使用java.awt.Color类来推导颜色的亮度值,并使用它来确定应使用哪种背景颜色。

编辑:此解决方案与其他一些解决方案不同,因为其他解决方案会将一些明亮的颜色视为黑暗,例如。初级红(#FF0000)。虽然这个解决方案,将初级红色视为您可以拥有的最亮的颜色之一。我想这取决于你的喜好。你想在白色上看到红色的黑色或红色吗?

String fontColor = "#0cf356";

// remove hash character from string
String rawFontColor = fontColor.substring(1,fontColor.length());

// convert hex string to int
int rgb = Integer.parseInt(rawFontColor, 16);

Color c = new Color(rgb);

float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null);

float brightness = hsb[2];

if (brightness < 0.5) {
   // use a bright background
} else {
   // use a dark background
}

HSB代表色调,饱和度,亮度 - 亮度也称为亮度。 Color类的值介于1和0之间.Ergo,0.5亮度是最亮颜色和最暗颜色之间的中间点。

色调,饱和度和亮度之间的相互作用比红色,蓝色和绿色稍微复杂一些。使用不同颜色的this工具实验,找到RGB和HSB之间的关系

答案 1 :(得分:10)

“颜色”通常表示24位RGB颜色:红色,绿色,蓝色为1字节(8位)。也就是说,每个通道的值都是0-255,或十六进制显示的0x00到0xff。

白色是所有通道全部:#FFFFFF,黑色是所有通道关闭:#000000。显然,较浅的颜色意味着较高的通道值,较暗的颜色意味着较低的通道值。

您选择算法的准确程度取决于您,简单的是:

//pseudo-code
if (red + green + blue <= (0xff * 3) / 2) //half-down, half-up
  fontcolor = white;
else
  fontcolor = black;

编辑:提问者要求提供更完整的示例,以便他/她可以有更好的开始,所以这里是:

public static void main(String[] args) throws IOException {

String value =
       // new Scanner(System.in).nextLine(); //from input
        "#112233"; //from constant
int red = Integer.parseInt(value.substring(1, 1 + 2), 16);
int green = Integer.parseInt(value.substring(3, 3 + 2), 16);
int blue = Integer.parseInt(value.substring(5, 5 + 2), 16);

System.out.println("red = " + Integer.toHexString(red)
        + ", green = " + Integer.toHexString(green)
        + ", blue = " + Integer.toHexString(blue));

if (red + green + blue <= 0xff * 3 / 2)
    System.out.println("using white color #ffffff");
else
    System.out.println("using black color #000000");

String colorBackToString = "#" + Integer.toHexString(red) +
        Integer.toHexString(green) +
        Integer.toHexString(blue);
System.out.println("color was " + colorBackToString);
}

它产生输出:

red = 11, green = 22, blue = 33
using white color #ffffff
color was #112233

并显示将#aabbcc格式的颜色分割为rgb通道,稍后加入它们(如果需要)等技术。

答案 2 :(得分:3)

更自然的方法可能是使用HSL颜色空间。您可以使用第三个组件(“亮度”)来确定颜色的亮度。这将适用于大多数目的。

googling有很多描述。基本上你采用具有最高值的颜色分量(假设它是红色)和具有最低值的颜色分量(比如绿色)。在这种情况下:

L = (red + green) / (255*2.0)

假设您将颜色提取为0到255之间的值。您将获得介于0和1之间的值。浅色可以是任何颜色,其亮度高于某个任意值(例如,0.6)。

答案 3 :(得分:2)

function isTooLightYIQ(hexcolor)
{
      var r = parseInt(hexcolor.substr(0,2),16);
      var g = parseInt(hexcolor.substr(2,2),16);
      var b = parseInt(hexcolor.substr(4,2),16);
      var yiq = ((r*299)+(g*587)+(b*114))/1000;
      return yiq >= 128;
}

http://www.careerbless.com/services/css/csstooltipcreator.php中使用的颜色选择器 效果很好

答案 4 :(得分:0)

以下是 PHP 中Kiran的回答,对我来说非常有用。谢谢基兰。

function isTooLightYIQ($hexcolor)
{
    $hexcolor = ltrim($hexcolor, "#");
    $r = base_convert(substr($hexcolor, 0, 2), 16, 10); 
    $g = base_convert(substr($hexcolor, 2, 2), 16, 10); 
    $b = base_convert(substr($hexcolor, 4, 2), 16, 10); 
    $yiq = (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
    return $yiq >= 128;
}

用法(使用maliayas's adjustBrightness() function):

$adjustPercent = -0.45;  //  45% darker
$darkHexColor = (isTooLightYIQ($hexColor)) ? adjustBrightness($hexColor, $adjustPercent) : $HexColor;