Определить основные цвета изображения с помощью PHP
Я пытаюсь повторить функциональность, которую Dribbble.com делает с обнаружением преобладающих цветов в изображении. На изображении ниже вы можете увидеть скриншот с Dribbble.com, который показывает 8 преобладающих цветов на изображении слева. Вот фактическая страница в изображенииhttp://dribbble.com/shots/528033-Fresh-Easy?list=following
Я должен быть в состоянии сделать это в PHP, как только я получу нужные мне цвета, я сохраню их в базе данных, чтобы не нужно было выполнять обработку при каждой загрузке страницы.
После некоторых исследований о том, как получить эти цвета из изображения, некоторые люди сказали, что вы просто исследуете изображение попиксельно, а затем сохраняете цвета, которые встречаются чаще всего. Другие говорят, что это еще не все, и получение наиболее часто встречающихся цветов не даст желаемого эффекта. Они говорят, что вам нужно квантовать изображение / цвета (я потерялся в этой точке).
На изображении ниже Dribble shot ниже - библиотека Javascript, которая делает то же самое, эту страницу можно посмотреть здесьhttp://lokeshdhakar.com/projects/color-thief/
Просматривая источник этой страницы, я вижу, что есть файл Javascript с именемquantize.js
и результаты действительно хороши. Поэтому я надеюсь, что смогу делать то, что делает эта библиотека Javascript, но с помощью PHP и GD / ImageMagick
Я нашел эту функцию, которая будет возвращать цвета и считать в изображении с PHP, но результаты отличаются от версии Javascript выше и результатов Dribble
<code>/** * 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)"); } </code>
Поэтому я спрашиваю, знает ли кто-нибудь, как я могу выполнить такую задачу с помощью PHP? Возможно, уже есть что-то, о чем вы знаете, или какие-либо советы, которые помогут мне сделать шаг ближе к этому