Определение основных цветов изображения с помощью PHP

Я пытаюсь воспроизвести функциональность, которую Dribbble.com делает с определением преобладающих цветов в изображении. На изображении ниже вы можете увидеть снимок экрана с Dribbble.com, на котором показаны 8 преобладающих цветов на изображении слева. Вот фактическая страница на изображении http://dribbble.com/shots/528033-Fresh-Easy?list=following

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

После некоторого исследования того, как получить эти цвета из изображения, некоторые люди сказали, что вы просто проверяете изображение пиксель за пикселем, а затем сохраняете цвета, которые встречаются чаще всего. Другие говорят, что в этом есть нечто большее, и что получение наиболее частых цветов не даст желаемого эффекта. Они говорят, что вам нужно Квантовать изображение/цвета (Я теряюсь в этом месте ).

На изображении ниже Dribble показана библиотека Javascript, которая делает то же самое,эту страницу можно посмотреть здесьhttp://lokeshdhakar.com/projects/color-thief/

Просматривая исходный код этой страницы, я вижу, что есть файл Javascript с именем quantize.js, и результаты действительно хорошие. Поэтому я надеюсь, что смогу делать то, что делает эта библиотека Javascript, но с PHP и GD/ImageMagick

enter image description here


. Я нашел эту функцию, которая будет возвращать цвета и количество в изображении с помощью PHP, но результаты отличаются от версии Javascript. выше и результаты Dribble

/**
 * Returns the colors of the image in an array, ordered in descending order, where the keys are the colors, and the values are the count of the color.
 *
 * @return array
 */
function Get_Color()
{
    if (isset($this->image))
    {
        $PREVIEW_WIDTH    = 150;  //WE HAVE TO RESIZE THE IMAGE, BECAUSE WE ONLY NEED THE MOST SIGNIFICANT COLORS.
        $PREVIEW_HEIGHT   = 150;
        $size = GetImageSize($this->image);
        $scale=1;
        if ($size[0]>0)
        $scale = min($PREVIEW_WIDTH/$size[0], $PREVIEW_HEIGHT/$size[1]);
        if ($scale < 1)
        {
            $width = floor($scale*$size[0]);
            $height = floor($scale*$size[1]);
        }
        else
        {
            $width = $size[0];
            $height = $size[1];
        }
        $image_resized = imagecreatetruecolor($width, $height);
        if ($size[2]==1)
        $image_orig=imagecreatefromgif($this->image);
        if ($size[2]==2)
        $image_orig=imagecreatefromjpeg($this->image);
        if ($size[2]==3)
        $image_orig=imagecreatefrompng($this->image);
        imagecopyresampled($image_resized, $image_orig, 0, 0, 0, 0, $width, $height, $size[0], $size[1]); //WE NEED NEAREST NEIGHBOR RESIZING, BECAUSE IT DOESN'T ALTER THE COLORS
        $im = $image_resized;
        $imgWidth = imagesx($im);
        $imgHeight = imagesy($im);
        for ($y=0; $y < $imgHeight; $y++)
        {
            for ($x=0; $x < $imgWidth; $x++)
            {
                $index = imagecolorat($im,$x,$y);
                $Colors = imagecolorsforindex($im,$index);
                $Colors['red']=intval((($Colors['red'])+15)/32)*32;    //ROUND THE COLORS, TO REDUCE THE NUMBER OF COLORS, SO THE WON'T BE ANY NEARLY DUPLICATE COLORS!
                $Colors['green']=intval((($Colors['green'])+15)/32)*32;
                $Colors['blue']=intval((($Colors['blue'])+15)/32)*32;
                if ($Colors['red']>=256)
                $Colors['red']=240;
                if ($Colors['green']>=256)
                $Colors['green']=240;
                if ($Colors['blue']>=256)
                $Colors['blue']=240;
                $hexarray[]=substr("0".dechex($Colors['red']),-2).substr("0".dechex($Colors['green']),-2).substr("0".dechex($Colors['blue']),-2);
            }
        }
        $hexarray=array_count_values($hexarray);
        natsort($hexarray);
        $hexarray=array_reverse($hexarray,true);
        return $hexarray;

    }
    else die("You must enter a filename! (\$image parameter)");
}

Итак, я спрашиваю, знает ли кто-нибудь, как я могу выполнить такую ​​задачу с помощью PHP? Возможно, что-то уже существует, о чем вы знаете, или любые советы, которые помогут мне приблизиться к этому, будут оценены

32
задан JasonDavis 24 April 2012 в 00:37
поделиться