php function colorname проблема - PullRequest
0 голосов
/ 19 июля 2011

Я сделал функцию, которая возвращает имя цвета. В парам. Я даю ширину массива цвет RGB.

Но когда я даю $ 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'];
    } 

Ответы [ 4 ]

0 голосов
/ 20 июля 2011

Основываясь на ответах выше, теперь у меня есть эта функция, которая кажется почти правильной.Но когда я даю, когда я попробую этот цвет, он возвращает темно-оливковый зеленый, но это скорее коричневый цвет.Есть ли проблема в моей функции?

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

функция getColorNameByRgbColors ($ str_comma_sep_rbg) {/ * проблема с именем цвета в php-функции * /

    $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;
}
0 голосов
/ 19 июля 2011

Может быть проблема в sort($array);

Вы сортируете массив массивов, так каков критерий для сравнения двух массивов, таких как array('verschil' => $diff, 'kleur' => $key);, для сравнения?

Второй (субъективный) аспект -Возможно, abs() - это плохой способ сравнения цветов, может быть, наблюдается некоторая нелинейность при просмотре цветов, также у вас нет ничего о люминесценции, у разных субцветов (RGB) различная люминесценция.Поэтому, возможно, вам стоит обратить внимание на некоторые проблемы со зрением у людей.

0 голосов
/ 19 июля 2011

Ваш код выглядит правильно, я запустил его и получил 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 голосов
/ 19 июля 2011

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 ... что на первый взгляд кажется возможным

...