2011-07-19 28 views
0

我做了一个返回颜色名称的函数。在参数。我给了一个数组宽度的RGB颜色。php函数颜色名称问题

但是,当我给$ arr_input [157,183,198]在函数返回黑暗。颜色更蓝,然后变黑。

我在做什么错在这里?

function getColorNameByRgbColors($arr_input) { 
     // red will have a diff of: 5 + 1 + 2 groen will have: 250 + 254 + 2 blue is : 250 + 1 + 253 

     // based on -->  http://www.w3.org/TR/SVG/types.html#ColorKeywords 
     $arr_colors = array(
       'aliceblue'    => array(240, 248, 255), 
       'antiquewit'   => array(250, 235, 215), 
       'aqua'     => array(0, 255, 255), 
       'aquamarine'   => array(127, 255, 212), 
       'azure'     => array(240, 255, 255), 
       'beige'     => array(245, 245, 220), 
       'bisque'    => array(255, 228, 196), 
       'zwart'     => array(0, 0, 0), 
       'blanchedalmond'  => array(255, 235, 205), 
       'blauuw'    => array(0, 0, 255), 
       'blauuwviolet'   => array(138, 43, 226), 
       'bruin'     => array(165, 42, 42), 
       'burlywood'    => array(222, 184, 135), 
       'cadetblue'    => array(95, 158, 160), 
       'chartreuse'   => array(127, 255, 0), 
       'chocolate'    => array(210, 105, 30), 
       'coral'     => array(255, 127, 80), 
       'cornflowerblue'  => array(100, 149, 237), 
       'cornsilk'    => array(255, 248, 220), 
       'crimson'    => array(220, 20, 60), 
       'cyan'     => array(0, 255, 255), 
       'darkblauuw'   => array(0, 0, 139), 
       'darkcyan'   => array(0, 139, 139), 
       'darkgoldenrod'  => array(184, 134, 11), 
       'darkgray'   => array(169, 169, 169), 
       'darkgroen'   => array(0, 100, 0), 
       'darkgrey'   => array(169, 169, 169), 
       'darkkhaki'   => array(189, 183, 107), 
       'darkmagenta'   => array(139, 0, 139), 
       'darkolivegroen'  => array(85, 107, 47), 
       'darkorange'   => array(255, 140, 0), 
       'darkorchid'   => array(153, 50, 204), 
       'darkred'    => array(139, 0, 0), 
       'darksalmon'   => array(233, 150, 122), 
       'darkseagroen'  => array(143, 188, 143), 
       'darkslateblue'  => array(72, 61, 139), 
       'darkslategray'  => array(47, 79, 79), 
       'darkslategrey'  => array(47, 79, 79), 
       'darkturquoise'  => array(0, 206, 209), 
       'darkviolet'   => array(148, 0, 211), 
       'deeppink'    => array(255, 20, 147), 
       'deepskyblue'   => array(0, 191, 255), 
       'dimgray'    => array(105, 105, 105), 
       'dodgerblue'   => array(30, 144, 255), 
       'firebrick'    => array(178, 34, 34), 
       'floralwit'    => array(255, 250, 240), 
       'forestgroen'   => array(34, 139, 34), 
       'fuchsia'    => array(255, 0, 255), 
       'gainsboro'    => array(220, 220, 220), 
       'ghostwit'    => array(248, 248, 255), 
       'gold'     => array(255, 215, 0), 
       'goldenrod'    => array(218, 165, 32), 
       'gray'     => array(128, 128, 128), 
       'grey'     => array(128, 128, 128), 
       'groen'     => array(0, 128, 0), 
       'groenyellow'   => array(173, 255, 47), 
       'honeydew'    => array(240, 255, 240), 
       'hotpink'    => array(255, 105, 180), 
       'indianrood'   => array(205, 92, 92), 
       'indigo'    => array(75, 0, 130), 
       'ivory'     => array(255, 255, 240), 
       'khaki'     => array(240, 230, 140), 
       'lavender'    => array(230, 230, 250), 
       'lavenderblush'   => array(255, 240, 245), 
       'lawngroen'    => array(124, 252, 0), 
       'lemonchiffon'   => array(255, 250, 205), 
       'lichtblauw'   => array(173, 216, 230), 
       'lichtcoral'   => array(240, 128, 128), 
       'lichtcyan'    => array(224, 255, 255), 
       'lichtgoldenrodyellow' => array(250, 250, 210), 
       'lichtgray'    => array(211, 211, 211), 
       'lichtgroen'   => array(144, 238, 144), 
       'lichtgrey'    => array(211, 211, 211), 
       'lichtpink'    => array(255, 182, 193), 
       'lichtsalmon'   => array(255, 160, 122), 
       'lichtseagroen'   => array(32, 178, 170), 
       'lichtskyblue'   => array(135, 206, 250), 
       'lichtslategray'  => array(119, 136, 153), 
       'lichtslategrey'  => array(119, 136, 153), 
       'lichtsteelblue'  => array(176, 196, 222), 
       'lichtyellow'   => array(255, 255, 224), 
       'lime'     => array(0, 255, 0), 
       'limegroen'    => array(50, 205, 50), 
       'linen'     => array(250, 240, 230), 
       'magenta'    => array(255, 0, 255), 
       'kastanjebruin'   => array(128, 0, 0), 
       'mediumaquamarine'  => array(102, 205, 170), 
       'mediumblue'   => array(0, 0, 205), 
       'mediumorchid'   => array(186, 85, 211), 
       'mediumpurple'   => array(147, 112, 219), 
       'mediumseagroen'  => array(60, 179, 113), 
       'mediumslateblauw'  => array(123, 104, 238), 
       'mediumspringgroen'  => array(0, 250, 154), 
       'mediumturquoise'  => array(72, 209, 204), 
       'mediumvioletred'  => array(199, 21, 133), 
       'midnightblauw'   => array(25, 25, 112), 
       'mintcream'    => array(245, 255, 250), 
       'mistyrose'    => array(255, 228, 225), 
       'moccasin'    => array(255, 228, 181), 
       'navajowit'    => array(255, 222, 173), 
       'navy'     => array(0, 0, 128), 
       'oldlace'    => array(253, 245, 230), 
       'olive'     => array(128, 128, 0), 
       'olivedrab'    => array(107, 142, 35), 
       'oranje'    => array(255, 165, 0), 
       'orangerood'   => array(255, 69, 0), 
       'orchid'    => array(218, 112, 214), 
       'palegoldenrod'   => array(238, 232, 170), 
       'palegroen'    => array(152, 251, 152), 
       'paleturquoise'   => array(175, 238, 238), 
       'palevioletred'   => array(219, 112, 147), 
       'papayawhip'   => array(255, 239, 213), 
       'peachpuff'    => array(255, 218, 185), 
       'peru'     => array(205, 133, 63), 
       'pink'     => array(255, 192, 203), 
       'plum'     => array(221, 160, 221), 
       'powderblue'   => array(176, 224, 230), 
       'paars'     => array(128, 0, 128), 
       'rood'     => array(255, 0, 0), 
       'rosybrown'    => array(188, 143, 143), 
       'royalblue'    => array(65, 105, 225), 
       'saddlebrown'   => array(139, 69, 19), 
       'salmon'    => array(250, 128, 114), 
       'sandybrown'   => array(244, 164, 96), 
       'seagroen'    => array(46, 139, 87), 
       'seashell'    => array(255, 245, 238), 
       'sienna'    => array(160, 82, 45), 
       'silver'    => array(192, 192, 192), 
       'skyblue'    => array(135, 206, 235), 
       'slateblue'    => array(106, 90, 205), 
       'slategray'    => array(112, 128, 144), 
       'slategrey'    => array(112, 128, 144), 
       'snow'     => array(255, 250, 250), 
       'springgroen'   => array(0, 255, 127), 
       'steelblue'    => array(70, 130, 180), 
       'tan'     => array(210, 180, 140), 
       'teal'     => array(0, 128, 128), 
       'thistle'    => array(216, 191, 216), 
       'tomato'    => array(255, 99, 71), 
       'turquoise'    => array(64, 224, 208), 
       'violet'    => array(238, 130, 238), 
       'wheat'     => array(245, 222, 179), 
       'wit'     => array(255, 255, 255), 
       'witsmoke'    => array(245, 245, 245), 
       'geel'     => array(255, 255, 0), 
       'geelgroen'    => array(154, 205, 50) 
     ); 
     foreach($arr_colors as $key=>$color) { 
      // echo $arr_input[0] .'--'. $color[0] . '<br />'; 
      $diff = abs($arr_input[0] - $color[0]) + abs($arr_input[1] - $color[1]) + abs($arr_input[2] - $color[2]); 
      $array[] = array('verschil' => $diff, 'kleur' => $key);  
     } 
     sort($array); 

     return $array[0]['kleur']; 
    } 

回答

0

也许问题是sort($array);

要排序数组的数组,那么是什么标准来比较喜欢array('verschil' => $diff, 'kleur' => $key);两个数组来比较呢?

第二(主观)方面 - 也许abs()是比较颜色的不好方法,也许在看到颜色时有一些非线性,也没有关于发光的东西,不同的子颜色(RGB)有不同的发光。所以也许你应该关注一些看起来很人性化的问题。

0

sort()不能对你提供的输入做一些“有意义”的事情。
您可以创建一个数组,如color=>distance,然后使用asort()

foreach($arr_colors as $key=>$color) { 
    $diff = abs($arr_input[0] - $color[0]) + abs($arr_input[1] - $color[1]) + abs($arr_input[2] - $color[2]); 
    $array[$key] = $diff; 
} 
asort($array); 
reset($array); 
list($key, $diff) = each($array); 
return $key 

测试脚本 <?php echo getColorNameByRgbColors(array(157,183,198)); 回报silver ......乍一看似乎是可行的

0

你的代码看起来正确的,我跑了,并得到silver。不过,我也试着在组件上差异化,并得到了(我认为是)更好的答案:lichtsteelblue。这里是我使用的代码:

$diff = pow($arr_input[0] - $color[0],2) + pow($arr_input[1] - $color[1], 2) + pow($arr_input[2] - $color[2], 2); 
0

基于上面的答案现在我有这个功能,似乎几乎是正确的。 但是,当我给予当我尝试这种颜色它返回黑橄榄绿,但它更多的是棕色的颜色。我的功能有问题吗?

$ str_color = getColorNameByRgbColors('100,76,66'); echo $ str_color;

功能getColorNameByRgbColors($ str_comma_sep_rbg){ /* * php function colorname problem/

$arr_input = explode(',', $str_comma_sep_rbg); 

    // Dark Olive Green 
    // based on -->  http://www.w3.org/TR/SVG/types.html#ColorKeywords 
    $arr_colors = array(
      'Alice Blue'   => array(240, 248, 255), 
      'Antique White'   => array(250, 235, 215), 
      'aqua'     => array(0, 255, 255), // *** 
      'Aquamarine'   => array(127, 255, 212), 
      'Azure'     => array(240, 255, 255), 
      'Beige'     => array(245, 245, 220), 
      'Bisque'    => array(255, 228, 196), 
      'Black'     => array(0, 0, 0), 
      'Blanched Almond'  => array(255, 235, 205), 
      'Blue'     => array(0, 0, 255), 
      'Blue Violet'   => array(138, 43, 226), 
      'Brown'     => array(165, 42, 42), 
      'Burlywood'    => array(222, 184, 135), 
      'Cadet Blue'   => array(95, 158, 160), 
      'Chartreuse'   => array(127, 255, 0), 
      'Chocolate'    => array(210, 105, 30), 
      'Coral'     => array(255, 127, 80), 
      'Cornflower Blue'  => array(100, 149, 237), 
      'Cornsilk'    => array(255, 248, 220), 
      'crimson'    => array(220, 20, 60), // *** 
      'Cyan'     => array(0, 255, 255), 
      'Dark blue'    => array(0, 0, 139), 
      'Dark Cyan'    => array(0, 139, 139), 
      'Dark Goldenrod'  => array(184, 134, 11), 
      'Dark Green'   => array(0, 100, 0), 
      'Dark Grey'    => array(169, 169, 169), 
      'Dark Khaki'   => array(189, 183, 107), 
      'Dark Magenta'   => array(139, 0, 139), 
      'Dark Olive Green'  => array(85, 107, 47), 
      'Dark Orange'   => array(255, 140, 0), 
      'Dark Orchid'   => array(153, 50, 204), 
      'Dark Red'    => array(139, 0, 0), 
      'Dark Salmon'   => array(233, 150, 122), 
      'Dark Sea Green'  => array(143, 188, 143), 
      'Dark Slate Blue'  => array(72, 61, 139), 
      'Dark Slate Gray'  => array(47, 79, 79), 
      'Dark Turquoise'  => array(0, 206, 209), 
      'Dark Violet'   => array(148, 0, 211), 
      'Deep Pink'    => array(255, 20, 147), 
      'Deep Sky Blue'   => array(0, 191, 255), 
      'Dim Gray'    => array(105, 105, 105), 
      'Dodger Blue'   => array(30, 144, 255), 
      'Firebrick'    => array(178, 34, 34), 
      'Floral White'   => array(255, 250, 240), 
      'Forest Green'   => array(34, 139, 34), 
      'fuchsia'    => array(255, 0, 255),  // **** 
      'Gainsboro'    => array(220, 220, 220), 
      'Ghost White'   => array(248, 248, 255), 
      'Gold'     => array(255, 215, 0), 
      'Goldenrod'    => array(218, 165, 32), 
      'Grey'     => array(128, 128, 128), 
      'Green'     => array(0, 128, 0), 
      'Green Yellow'   => array(173, 255, 47), 
      'Honeydew'    => array(240, 255, 240), 
      'Hot Pink'    => array(255, 105, 180), 
      'Indian Red'   => array(205, 92, 92), 
      'Indigo'    => array(75, 0, 130), 
      'Ivory'     => array(255, 255, 240), 
      'Khaki'     => array(240, 230, 140), 
      'Lavender'    => array(230, 230, 250), 
      'Lavender Blush'  => array(255, 240, 245), 
      'Lawn Green'   => array(124, 252, 0), 
      'Lemon Chiffon'   => array(255, 250, 205), 
      'Light Blue'   => array(173, 216, 230), 
      'Light Coral'   => array(240, 128, 128), 
      'Light Cyan'   => array(224, 255, 255), 
      'Light Goldenrod Yellow'=> array(250, 250, 210), 
      'Light Gray'   => array(211, 211, 211), 
      'Light Green'   => array(144, 238, 144), 
      'Light Pink'   => array(255, 182, 193), 
      'Light Salmon'   => array(255, 160, 122), 
      'Light Sea Green'  => array(32, 178, 170), 
      'Light Sky Blue'  => array(135, 206, 250), 
      'Light Slate Gray'  => array(119, 136, 153), 
      'Light Steel Blue'  => array(176, 196, 222), 
      'Light Yellow'   => array(255, 255, 224), 
      'Lime'     => array(0, 255, 0), 
      'Lime Green'   => array(50, 205, 50), 
      'Linen'     => array(250, 240, 230), 
      'magenta'    => array(255, 0, 255),  // ****d 
      'Maroon'    => array(128, 0, 0), 
      'Medium Aquamarine'  => array(102, 205, 170), 
      'Medium Blue'   => array(0, 0, 205), 
      'Medium Orchid'   => array(186, 85, 211), 
      'Medium Purple'   => array(147, 112, 219), 
      'Medium Sea Green'  => array(60, 179, 113), 
      'Medium Slate Blue'  => array(123, 104, 238), 
      'Medium Spring Green' => array(0, 250, 154), 
      'Medium Turquoise'  => array(72, 209, 204), 
      'Medium Violet Red'  => array(199, 21, 133), 
      'Midnight Blue'   => array(25, 25, 112), 
      'Mint Cream'   => array(245, 255, 250), 
      'Misty Rose'   => array(255, 228, 225), 
      'Moccasin'    => array(255, 228, 181), 
      'Navajo White'   => array(255, 222, 173), 
      'Navy'     => array(0, 0, 128), 
      'Old Lace'    => array(253, 245, 230), 
      'olive'     => array(128, 128, 0), // **** 
      'Olive Drab'   => array(107, 142, 35), 
      'Orange'    => array(255, 165, 0), 
      'Orange Red'   => array(255, 69, 0), 
      'Orchid'    => array(218, 112, 214), 
      'Pale Goldenrod'  => array(238, 232, 170), 
      'Pale Green'   => array(152, 251, 152), 
      'Pale Turquoise'  => array(175, 238, 238), 
      'Pale Violet Red'  => array(219, 112, 147), 
      'Papaya Whip'   => array(255, 239, 213), 
      'Peach Puff'   => array(255, 218, 185), 
      'Peru'     => array(205, 133, 63), 
      'Pink'     => array(255, 192, 203), 
      'Plum'     => array(221, 160, 221), 
      'Powder Blue'   => array(176, 224, 230), 
      'Purple'    => array(128, 0, 128), 
      'Red'     => array(255, 0, 0), 
      'Rosy Brown'   => array(188, 143, 143), 
      'Royal Blue'   => array(65, 105, 225), 
      'Saddle Brown'   => array(139, 69, 19), 
      'Salmon'    => array(250, 128, 114), 
      'Sandy Brown'   => array(244, 164, 96), 
      'Sea Green'    => array(46, 139, 87), 
      'Seashell'    => array(255, 245, 238), 
      'Sienna'    => array(160, 82, 45), 
      'Silver'    => array(192, 192, 192), 
      'Sky Blue'    => array(135, 206, 235), 
      'Slate Blue'   => array(106, 90, 205), 
      'Slate Gray'   => array(112, 128, 144), 
      'Snow'     => array(255, 250, 250), 
      'Spring Green'   => array(0, 255, 127), 
      'Steel Blue'   => array(70, 130, 180), 
      'Tan'     => array(210, 180, 140), 
      'teal'     => array(0, 128, 128), 
      'Thistle'    => array(216, 191, 216), 
      'Tomato'    => array(255, 99, 71), 
      'Turquoise'    => array(64, 224, 208), 
      'Violet'    => array(238, 130, 238), 
      'Wheat'     => array(245, 222, 179), 
      'White'     => array(255, 255, 255), 
      'White Smoke'   => array(245, 245, 245), 
      'Yellow'    => array(255, 255, 0), 
      'Yellow Green'   => array(154, 205, 50) 
    ); 
    foreach($arr_colors as $key=>$color) { 
     // $diff = abs($arr_input[0] - $color[0]) + abs($arr_input[1] - $color[1]) + abs($arr_input[2] - $color[2]); 

     // Your code looks right, I ran it and got silver. However, I also tried squaring the differences in the components and got (what I thought was) an even better answer: lichtsteelblue. Here's the code I used: 

     $diff = pow($arr_input[0] - $color[0],2) + pow($arr_input[1] - $color[1], 2) + pow($arr_input[2] - $color[2], 2); 

     $array[$key] = $diff; 
    } 
    asort($array); 
    reset($array); 

    list($key, $diff) = each($array); 
    return $key; 
}