Hex代码亮度PHP?

时间:2010-06-10 14:05:28

标签: php colors hex brightness

我希望我网站上的用户能够选择十六进制颜色,我只想显示深色的白色文本和浅色的黑色文本。你能用十六进制代码(最好是PHP)来计算亮度吗?

6 个答案:

答案 0 :(得分:44)

$hex = "78ff2f"; //Bg color in hex, without any prefixing #!

//break up the color in its RGB components
$r = hexdec(substr($hex,0,2));
$g = hexdec(substr($hex,2,2));
$b = hexdec(substr($hex,4,2));

//do simple weighted avarage
//
//(This might be overly simplistic as different colors are perceived
// differently. That is a green of 128 might be brighter than a red of 128.
// But as long as it's just about picking a white or black text color...)
if($r + $g + $b > 382){
    //bright color, use dark font
}else{
    //dark color, use bright font
}

答案 1 :(得分:18)

我做了一个相似的 - 但是基于每种颜色的加权(based on the C# version of this thread)

function readableColour($bg){
    $r = hexdec(substr($bg,0,2));
    $g = hexdec(substr($bg,2,2));
    $b = hexdec(substr($bg,4,2));

    $contrast = sqrt(
        $r * $r * .241 +
        $g * $g * .691 +
        $b * $b * .068
    );

    if($contrast > 130){
        return '000000';
    }else{
        return 'FFFFFF';
    }
}

echo readableColour('000000'); // Output - FFFFFF

修改 小优化: Sqrt被称为昂贵的数学运算,在大多数情况下可能是可以忽略的,但无论如何,可以通过做这样的事情来避免它。

function readableColour($bg){
    $r = hexdec(substr($bg,0,2));
    $g = hexdec(substr($bg,2,2));
    $b = hexdec(substr($bg,4,2));

    $squared_contrast = (
        $r * $r * .299 +
        $g * $g * .587 +
        $b * $b * .114
    );

    if($squared_contrast > pow(130, 2)){
        return '000000';
    }else{
        return 'FFFFFF';
    }
}

echo readableColour('000000'); // Output - FFFFFF

它根本不应用sqrt,而是将所需的截止对比度提高2,这是一个便宜得多的计算

答案 2 :(得分:3)

我知道这是一个非常古老的主题,但对于来自“Google搜索”的用户,此链接可能正是他们所寻找的。我已经搜索过这样的内容,我认为在这里发布它是个好主意:

https://github.com/mexitek/phpColors

use Mexitek\PHPColors\Color;
// Initialize my color
$myBlue = new Color("#336699");

echo $myBlue->isLight(); // false
echo $myBlue->isDark(); // true

就是这样。

答案 3 :(得分:2)

您需要将RGB值转换为HLS / HSL(色调亮度和饱和度),然后您可以使用亮度来确定是需要浅色文本还是暗文本。

This page有一些关于如何在PHP中进行转换以及从中选择补色的细节。

我刚刚发现该网站是一个占星术网站 - 如果有人冒犯了,那么道歉。

答案 4 :(得分:1)

如果你激活了imagemagick扩展,你可以简单地创建一个ImagickPixel对象,用你的十六进制值调用setColor,然后调用getHSL()(并获取我想到的获取数组的最后一项)......

答案 5 :(得分:0)

我尝试了不同的方法,我使用HSL(色调,饱和度和亮度)亮度百分比来检查颜色是暗还是浅。 (就像@chrisf在他的回答中所说的那样)

<强>功能

function colorislight($hex) {
   $hex       = str_replace('#', '', $hex);
   $r         = (hexdec(substr($hex, 0, 2)) / 255);
   $g         = (hexdec(substr($hex, 2, 2)) / 255);
   $b         = (hexdec(substr($hex, 4, 2)) / 255);
   $lightness = round((((max($r, $g, $b) + min($r, $g, $b)) / 2) * 100));
   return ($lightness >= 50 ? true : false);
}

在返回行上,它会检查亮度百分比是否高于50%并返回true,否则返回false。如果颜色具有30%的亮度,您可以轻松地将其更改为true,依此类推。 $lightness变量可以从0返回到100 0是最暗的,100是最轻的。

如何使用该功能:

$color = '#111111';
if ( colorislight($color) ) {
   echo 'this color is light';
}
else {
   echo 'this color is dark';
}