Sto cercando di replicare la funzionalità che Dribbble.com esegue con il rilevamento dei colori predominanti in un'immagine. Nell'immagine qui sotto puoi vedere uno screenshot di Dribbble.com che mostra gli 8 colori predominanti nell'immagine a sinistra. Ecco la pagina reale nell'immagine http://dribbble.com/shots/528033-Fresh-Easy?list=followingRileva i colori principali in un'immagine con PHP
Ho bisogno di essere in grado di farlo in PHP, una volta che ottengo i colori di cui ho bisogno io li salva in un database in modo che il trattamento non ha bisogno di essere eseguito su ogni pagina caricare.
Dopo alcune ricerche su come ottenere questi colori da un'immagine, alcune persone hanno detto che si esamina semplicemente un'immagine pixel per pixel e quindi si salvano i colori che si verificano maggiormente. Altri dicono che c'è di più e che ottenere i colori più frequenti non darà l'effetto desiderato. Dicono che è necessario quantizzare l'immagine/i colori (sono perso a questo punto).
Nell'immagine sottostante il colpo Dribble sotto è una libreria JavaScript che fa la stessa cosa, la pagina può essere vista qui http://lokeshdhakar.com/projects/color-thief/
Visualizza la fonte di quella pagina posso vedere c'è un file JavaScript denominato quantize.js
e i risultati sono davvero buoni. Quindi spero di essere in grado di fare ciò che libreria Javascript fa, ma con PHP e GD/ImageMagick
avevo trovato questa funzione che restituirà i colori e contare in un'immagine con PHP ma i risultati sono diversi dalla versione Javascript sopra e la Dribble risultati
/**
* 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)");
}
Così mi chiedo se qualcuno sa come posso fare un tale compito con PHP? Probabilmente esiste già qualcosa che conosci o qualche consiglio per farmi un passo avanti.
http://stackoverflow.com/questions/3468500/detect-overall-average-color-of-the-picture –
@aSeptik sembra che stia facendo lo stesso del codice che ho già postato – JasonDavis
hai provato per cercare google per "php get color palette from image" "Ho fondato molti risultati; solo chiedendo ... –