Функция PHP в шестнадцатеричной или RGB-цвет, чтобы имя цвета - PullRequest
3 голосов
/ 15 июля 2011

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

Пожалуйста, помогите

Ответы [ 2 ]

2 голосов
/ 01 декабря 2012

См. Мой код ниже. Я использую его для копирования цвета логотипа, чтобы автоматически изменять тему сайта во время выполнения. Надеюсь, что это работает!

Просто передайте URL-адрес изображения в качестве параметра функции.

function CopyLogoColor($logo_path){
    $i = imagecreatefromjpeg($logo_path);

    $rTotal = 0;
    $gTotal =0;
    $bTotal = 0;
    $total = 0;

    for ( $x=0 ; $x<imagesx($i) ; $x++){
        for ( $y=0 ; $y<imagesy($i) ; $y++ ) {
            $rgb = imagecolorat($i,$x,$y);
            $r   = ($rgb >> 16) & 0xFF;
            $g   = ($rgb >> 8)& 0xFF;
            $b   = $rgb & 0xFF;

            $rTotal += $r;
            $gTotal += $g;
            $bTotal += $b;
            $total++;

        }
    }

    $rAverage = round($rTotal/$total);
    $gAverage = round($gTotal/$total);
    $bAverage = round($bTotal/$total);



    $r = intval($rAverage); 
    $g = intval($gAverage);
    $b = intval($bAverage);

    $r = dechex($r<0?0:($r>255?255:$r));
    $g = dechex($g<0?0:($g>255?255:$g));
    $b = dechex($b<0?0:($b>255?255:$b));

    $color = (strlen($r) < 2?'0':'').$r;
    $color .= (strlen($g) < 2?'0':'').$g;
    $color .= (strlen($b) < 2?'0':'').$b;

    return '#'.$color;

}
1 голос
/ 15 июля 2011

такой функции нет,

вам нужно написать свою собственную функцию, которая извлекает значения R, G и B по отдельности, и зацикливает их на каждое значение и обнаруживает, что самое близкое это (общее количество R и G и B меньше самого маленького)

Вы можете найти все названия цветов HTML здесь: http://www.w3.org/TR/SVG/types.html#ColorKeywords


например:

пользователь дает в [250,1,2] (красный цвет). у вас есть массив:

$input = [255,1,2]
$colors = array("red" => [255,0,0],"green"=>[0,255,0]) // used JS array to be quiker

foreach( $ .. as .. $color){ // or a sort function?
// get diff, key 0 is red key 2 is blue
$diff = abs($input[0] - $color[0]) + ... + abs($input[2] - $color[2]); 
}

красный будет иметь разность: 5 + 1 + 2 зеленый будет иметь: 250 + 254 + 2 синий это: 250 + 1 + 253

красный имеет наименьшую сумму, поэтому он должен быть ближе к красному. следующий - синий, а затем зеленый

...