php - 将十六进制颜色值转换为近似颜色名称的函数?

标签 php colors hex

我想没有人知道可以采用十六进制颜色代码并为该十六进制值提供近似颜色名称的函数(最好是 PHP)。我不需要有 100 种颜色的解决方案。即使只有白色、黑色、红色、绿色蓝色、棕色橙色和黄色,我的身材也很好。

如果您不知道现有资源,有人知道解决此问题的好方法吗?

在此先感谢您的帮助。

最佳答案

你有一个颜色列表 here in wikipedia .

一个天真的实现只会计算你想要检索其名称的颜色与每一个颜色之间的距离,并输出更接近的那个。

如果您将颜色视为 R3 中的向量,则可以将距离计算为 L1 范数:

function distancel1(array $color1, array $color2) {
    return abs($color1[0] - $color2[0]) + 
        abs($color1[1] - $color2[1]) +
        abs($color1[2] - $color2[2]);
}

或 L2 规范:

function distancel2(array $color1, array $color2) {
    return sqrt(pow($color1[0] - $color2[0], 2) +
        pow($color1[1] - $color2[1], 2) +
        pow($color1[2] - $color2[2], 2));
}

要转换十六进制表示法,请参阅 here .

示例脚本:

<?php

$colors = array(
    "black"     => array(0, 0, 0),
    "green"     => array(0, 128, 0),
    "silver"    => array(192, 192, 192),
    "lime"      => array(0, 255, 0),
    "gray"      => array(128, 0, 128),
    "olive"     => array(128, 128, 0),
    "white"     => array(255, 255, 255),
    "yellow"    => array(255, 255, 0),
    "maroon"    => array(128, 0, 0),
    "navy"      => array(0, 0, 128),
    "red"       => array(255, 0, 0),
    "blue"      => array(0, 0, 255),
    "purple"    => array(128, 0, 128),
    "teal"      => array(0, 128, 128),
    "fuchsia"   => array(255, 0, 255),
    "aqua"      => array(0, 255, 255),
);

$value = "#819001";

function html2rgb($color)
{
    if ($color[0] == '#')
        $color = substr($color, 1);

    if (strlen($color) == 6)
        list($r, $g, $b) = array($color[0].$color[1],
                                 $color[2].$color[3],
                                 $color[4].$color[5]);
    elseif (strlen($color) == 3)
        list($r, $g, $b) = array($color[0].$color[0],
            $color[1].$color[1], $color[2].$color[2]);
    else
        return false;

    $r = hexdec($r); $g = hexdec($g); $b = hexdec($b);

    return array($r, $g, $b);
}

function distancel2(array $color1, array $color2) {
    return sqrt(pow($color1[0] - $color2[0], 2) +
        pow($color1[1] - $color2[1], 2) +
        pow($color1[2] - $color2[2], 2));
}

$distances = array();
$val = html2rgb($value);
foreach ($colors as $name => $c) {
    $distances[$name] = distancel2($c, $val);
}

$mincolor = "";
$minval = pow(2, 30); /*big value*/
foreach ($distances as $k => $v) {
    if ($v < $minval) {
        $minval = $v;
        $mincolor = $k;
    }
}

echo "Closest color: $mincolor\n";

关于php - 将十六进制颜色值转换为近似颜色名称的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2993970/

相关文章:

Java - 整数到 4 个字符的十六进制

python - 将字符串打印为十六进制字节

php - 如何为 MacOS Big Sur 启用 Xdebug? "php -m"显示正常,但 "phpinfo();"不显示

php - 包含在 PHP 中的问题

java - java Swing 中可以修改图像的颜色吗?

ios - Pixate Freestyle for iOS - 将背景颜色设置为 UINavigationBar 无效

php - 警告 : fflush() expects exactly 1 parameter, 0 给出

php - 如何使用安全的 POP3 服务器覆盖 imap_timeout 功能的 php.ini 超时

colors - 以这种方式表示颜色#ffffff 和 0xffffff 有什么区别?

转换 Long -> Hex,然后将该 Hex 分配给 C 中的 Char