十六进制代码亮度PHP?

Posted

技术标签:

【中文标题】十六进制代码亮度PHP?【英文标题】:Hex Code Brightness PHP? 【发布时间】:2011-03-02 04:51:39 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

我刚刚发现该网站是一个占星术网站 - 如果有人冒犯了,敬请见谅。

【讨论】:

关于占星术网站:是的,这太可怕了!(不,开玩笑的,有趣的是他们的网站上有这样一个与编程相关的主题,我没想到会这样。) 【参考方案2】:

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

【讨论】:

【参考方案3】:
$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

【讨论】:

工作完美,甚至不需要进入色相和饱和度! :) 在我的情况下,使用 250 而不是 382 效果更好。我认为全绿色 (#00ff00) 不应该使用浅色字体,而全红色适合深色字体颜色。只是说。【参考方案4】:

我做了一个类似的 - 但基于每种颜色的权重(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,这是一个更便宜的计算

【讨论】:

这太棒了!谢谢! 要在 dec 中获取 R G B 值,只需使用以下行:list($r, $g, $b) = sscanf($color, "%02x%02x%02x"); 或者如果 $color 以 # list($r, $g, $b) = sscanf($color, "#%02x%02x%02x"); 开头【参考方案5】:

我知道这是一个非常古老的话题,但是对于来自“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

就是这样。

【讨论】:

【参考方案6】:

我尝试了一种不同的方法,我使用 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';

【讨论】:

以上是关于十六进制代码亮度PHP?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 随机生成颜色

使用 PHP 生成随机十六进制颜色代码

php的进制转换

在 PHP 中对类似的十六进制代码进行分组

十六进制颜色

看到全是十六进制的PHP代码文件?