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
相关产品推荐
相关产品推荐

