我希望我网站上的用户能够选择十六进制颜色,我只想为深色显示白色文本,为浅色显示黑色文本。你能从十六进制代码(最好是 PHP)中计算出亮度吗?
6 回答
$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
}
我做了一个类似的 - 但基于每种颜色的权重(基于此线程的 C# 版本)
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,这是一个便宜得多的计算
我知道这是一个非常古老的话题,但是对于来自“谷歌搜索”的用户来说,这个链接可能是他们正在寻找的。我已经搜索过类似的东西,我认为在这里发布它是个好主意:
https://github.com/mexitek/phpColors
use Mexitek\PHPColors\Color;
// Initialize my color
$myBlue = new Color("#336699");
echo $myBlue->isLight(); // false
echo $myBlue->isDark(); // true
就是这样。
您需要将 RGB 值转换为 HLS/HSL(色调亮度和饱和度),然后您可以使用亮度来确定您需要浅色文本还是深色文本。
这个页面有一些关于如何在 PHP 中转换以及从中选择补色的详细信息。
我刚刚发现该网站是一个占星术网站 - 如果有人冒犯了我,我深表歉意。
如果您激活了 imagemagick 扩展,您可以简单地创建一个 ImagickPixel 对象,使用您的十六进制值调用 setColor,然后调用 getHSL() (并获取我想获得的数组的最后一项)......
我尝试了一种不同的方法,我使用 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';
}