You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP项目中十六进制颜色匹配至最接近HTML标准颜色求助

解决PHP中匹配RGB到最接近HTML标准颜色的问题

核心思路

  • 先定义完整的HTML标准颜色与RGB值的映射表
  • 通过计算颜色间的欧几里得距离判断相似度(距离越小颜色越接近)
  • 遍历所有标准颜色,筛选出距离最小的匹配项

实现步骤与代码

1. 定义HTML标准颜色映射表

整理所有HTML标准颜色的RGB对应关系,以下是完整映射数组:

$htmlColors = [
    'AliceBlue' => [240, 248, 255],
    'AntiqueWhite' => [250, 235, 215],
    'Aqua' => [0, 255, 255],
    'Aquamarine' => [127, 255, 212],
    'Azure' => [240, 255, 255],
    'Beige' => [245, 245, 220],
    'Bisque' => [255, 228, 196],
    'Black' => [0, 0, 0],
    'BlanchedAlmond' => [255, 235, 205],
    'Blue' => [0, 0, 255],
    'BlueViolet' => [138, 43, 226],
    'Brown' => [165, 42, 42],
    'BurlyWood' => [222, 184, 135],
    'CadetBlue' => [95, 158, 160],
    'Chartreuse' => [127, 255, 0],
    'Chocolate' => [210, 105, 30],
    'Coral' => [255, 127, 80],
    'CornflowerBlue' => [100, 149, 237],
    'Cornsilk' => [255, 248, 220],
    'Crimson' => [220, 20, 60],
    'Cyan' => [0, 255, 255],
    'DarkBlue' => [0, 0, 139],
    'DarkCyan' => [0, 139, 139],
    'DarkGoldenRod' => [184, 134, 11],
    'DarkGray' => [169, 169, 169],
    'DarkGreen' => [0, 100, 0],
    'DarkKhaki' => [189, 183, 107],
    'DarkMagenta' => [139, 0, 139],
    'DarkOliveGreen' => [85, 107, 47],
    'DarkOrange' => [255, 140, 0],
    'DarkOrchid' => [153, 50, 204],
    'DarkRed' => [139, 0, 0],
    'DarkSalmon' => [233, 150, 122],
    'DarkSeaGreen' => [143, 188, 143],
    'DarkSlateBlue' => [72, 61, 139],
    'DarkSlateGray' => [47, 79, 79],
    'DarkTurquoise' => [0, 206, 209],
    'DarkViolet' => [148, 0, 211],
    'DeepPink' => [255, 20, 147],
    'DeepSkyBlue' => [0, 191, 255],
    'DimGray' => [105, 105, 105],
    'DodgerBlue' => [30, 144, 255],
    'FireBrick' => [178, 34, 34],
    'FloralWhite' => [255, 250, 240],
    'ForestGreen' => [34, 139, 34],
    'Fuchsia' => [255, 0, 255],
    'Gainsboro' => [220, 220, 220],
    'GhostWhite' => [248, 248, 255],
    'Gold' => [255, 215, 0],
    'GoldenRod' => [218, 165, 32],
    'Gray' => [128, 128, 128],
    'Green' => [0, 128, 0],
    'GreenYellow' => [173, 255, 47],
    'HoneyDew' => [240, 255, 240],
    'HotPink' => [255, 105, 180],
    'IndianRed' => [205, 92, 92],
    'Indigo' => [75, 0, 130],
    'Ivory' => [255, 255, 240],
    'Khaki' => [240, 230, 140],
    'Lavender' => [230, 230, 250],
    'LavenderBlush' => [255, 240, 245],
    'LawnGreen' => [124, 252, 0],
    'LemonChiffon' => [255, 250, 205],
    'LightBlue' => [173, 216, 230],
    'LightCoral' => [240, 128, 128],
    'LightCyan' => [224, 255, 255],
    'LightGoldenRodYellow' => [250, 250, 210],
    'LightGray' => [211, 211, 211],
    'LightGreen' => [144, 238, 144],
    'LightPink' => [255, 182, 193],
    'LightSalmon' => [255, 160, 122],
    'LightSeaGreen' => [32, 178, 170],
    'LightSkyBlue' => [135, 206, 250],
    'LightSlateGray' => [119, 136, 153],
    'LightSteelBlue' => [176, 196, 222],
    'LightYellow' => [255, 255, 224],
    'Lime' => [0, 255, 0],
    'LimeGreen' => [50, 205, 50],
    'Linen' => [250, 240, 230],
    'Magenta' => [255, 0, 255],
    'Maroon' => [128, 0, 0],
    'MediumAquamarine' => [102, 205, 170],
    'MediumBlue' => [0, 0, 205],
    'MediumOrchid' => [186, 85, 211],
    'MediumPurple' => [147, 112, 219],
    'MediumSeaGreen' => [60, 179, 113],
    'MediumSlateBlue' => [123, 104, 238],
    'MediumSpringGreen' => [0, 250, 154],
    'MediumTurquoise' => [72, 209, 204],
    'MediumVioletRed' => [199, 21, 133],
    'MidnightBlue' => [25, 25, 112],
    'MintCream' => [245, 255, 250],
    'MistyRose' => [255, 228, 225],
    'Moccasin' => [255, 228, 181],
    'NavajoWhite' => [255, 222, 173],
    'Navy' => [0, 0, 128],
    'OldLace' => [253, 245, 230],
    'Olive' => [128, 128, 0],
    'OliveDrab' => [107, 142, 35],
    'Orange' => [255, 165, 0],
    'OrangeRed' => [255, 69, 0],
    'Orchid' => [218, 112, 214],
    'PaleGoldenRod' => [238, 232, 170],
    'PaleGreen' => [152, 251, 152],
    'PaleTurquoise' => [175, 238, 238],
    'PaleVioletRed' => [219, 112, 147],
    'PapayaWhip' => [255, 239, 213],
    'PeachPuff' => [255, 218, 185],
    'Peru' => [205, 133, 63],
    'Pink' => [255, 192, 203],
    'Plum' => [221, 160, 221],
    'PowderBlue' => [176, 224, 230],
    'Purple' => [128, 0, 128],
    'RebeccaPurple' => [102, 51, 153],
    'Red' => [255, 0, 0],
    'RosyBrown' => [188, 143, 143],
    'RoyalBlue' => [65, 105, 225],
    'SaddleBrown' => [139, 69, 19],
    'Salmon' => [250, 128, 114],
    'SandyBrown' => [244, 164, 96],
    'SeaGreen' => [46, 139, 87],
    'SeaShell' => [255, 245, 238],
    'Sienna' => [160, 82, 45],
    'Silver' => [192, 192, 192],
    'SkyBlue' => [135, 206, 235],
    'SlateBlue' => [106, 90, 205],
    'SlateGray' => [112, 128, 144],
    'Snow' => [255, 250, 250],
    'SpringGreen' => [0, 255, 127],
    'SteelBlue' => [70, 130, 180],
    'Tan' => [210, 180, 140],
    'Teal' => [0, 128, 128],
    'Thistle' => [216, 191, 216],
    'Tomato' => [255, 99, 71],
    'Turquoise' => [64, 224, 208],
    'Violet' => [238, 130, 238],
    'Wheat' => [245, 222, 179],
    'White' => [255, 255, 255],
    'WhiteSmoke' => [245, 245, 245],
    'Yellow' => [255, 255, 0],
    'YellowGreen' => [154, 205, 50]
];

2. 实现颜色匹配函数

该函数会验证输入RGB的合法性,计算与所有HTML颜色的距离,返回最匹配的颜色名称:

function getClosestHtmlColor($r, $g, $b) {
    global $htmlColors;
    
    // 验证RGB值是否为0-255之间的整数
    if (!is_int($r) || !is_int($g) || !is_int($b) || $r < 0 || $r > 255 || $g < 0 || $g > 255 || $b < 0 || $b > 255) {
        throw new InvalidArgumentException('RGB值必须是0-255之间的整数');
    }
    
    $closestColor = '';
    $minDistance = PHP_INT_MAX;
    
    foreach ($htmlColors as $colorName => [$cr, $cg, $cb]) {
        // 计算欧几里得距离
        $distance = sqrt(pow($r - $cr, 2) + pow($g - $cg, 2) + pow($b - $cb, 2));
        
        if ($distance < $minDistance) {
            $minDistance = $distance;
            $closestColor = $colorName;
        }
    }
    
    return $closestColor;
}

3. 使用示例

// 假设从图片提取的主色调为[241, 242, 244]
try {
    $matchedColor = getClosestHtmlColor(241, 242, 244);
    echo "匹配到的HTML标准颜色:" . $matchedColor; // 输出:WhiteSmoke
} catch (InvalidArgumentException $e) {
    echo "错误:" . $e->getMessage();
}

优化建议

  • 若追求更高精度,可将欧几里得距离替换为CIE76色差公式(需先将RGB转换为Lab颜色空间),适合对颜色匹配要求极高的场景。
  • 将$htmlColors数组缓存到静态变量或配置文件中,避免重复加载,提升批量处理的性能。
  • 处理大量颜色时,可提前将HTML颜色的RGB值预处理为二维数组,减少循环内的重复操作。

内容的提问来源于stack exchange,提问作者Taylor Grant-Fordham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:20:22