2011-10-11 15 views
25

Come posso rilevare i 2 colori principali di un'immagine in PHP?Rilevamento di colori per un'immagine utilizzando PHP

per esempio ho questa immagine:

enter image description here

Questa funzione/processo ritornerà: 0000FF o blu e FFFF00 o GIALLO

Grazie

+2

Questo potrebbe essere qualcosa per te: http://stackoverflow.com/questions/3468500/detect-overall-average-color-of-the-picture – samn

+0

grazie, questo è impressionante. Puoi metterlo come risposta? – Tech4Wilco

risposta

20

Ecco una scr IPT che vi darà la lista:

function detectColors($image, $num, $level = 5) { 
    $level = (int)$level; 
    $palette = array(); 
    $size = getimagesize($image); 
    if(!$size) { 
    return FALSE; 
    } 
    switch($size['mime']) { 
    case 'image/jpeg': 
     $img = imagecreatefromjpeg($image); 
     break; 
    case 'image/png': 
     $img = imagecreatefrompng($image); 
     break; 
    case 'image/gif': 
     $img = imagecreatefromgif($image); 
     break; 
    default: 
     return FALSE; 
    } 
    if(!$img) { 
    return FALSE; 
    } 
    for($i = 0; $i < $size[0]; $i += $level) { 
    for($j = 0; $j < $size[1]; $j += $level) { 
     $thisColor = imagecolorat($img, $i, $j); 
     $rgb = imagecolorsforindex($img, $thisColor); 
     $color = sprintf('%02X%02X%02X', (round(round(($rgb['red']/0x33)) * 0x33)), round(round(($rgb['green']/0x33)) * 0x33), round(round(($rgb['blue']/0x33)) * 0x33)); 
     $palette[$color] = isset($palette[$color]) ? ++$palette[$color] : 1; 
    } 
    } 
    arsort($palette); 
    return array_slice(array_keys($palette), 0, $num); 
} 

$img = 'icon.png'; 
$palette = detectColors($img, 6, 1); 
echo '<img src="' . $img . '" />'; 
echo '<table>'; 
foreach($palette as $color) { 
    echo '<tr><td style="background:#' . $color . '; width:36px;"></td><td>#' . $color . '</td></tr>'; 
} 
echo '</table>'; 
+5

Fondamentalmente hai appena copiato il codice della pagina a cui mi riferisco. Way to go ... – samn

+3

e ho aggiunto una correzione ma sì sei corretto – rcs20

+4

Vorrei ottimizzare questo sostituendo il caso Switch con '$ img = @imagecreatefromstring (file_get_contents ($ image));' così puoi elaborare diversi tipi di immagine efficientemente ... – Andres

0

Se siete OK per chiamare un programma di utilità esterna, Imagemagick può generare un istogramma per voi. Probabilmente sarà molto più veloce di un'implementazione PHP.

In sostanza, questo comando fornisce un elenco di colori, ordinato dai più dominante prima:

convert 'http://i.stack.imgur.com/J2txV.png' -format %c histogram:info:-|sort -r 

Si potrebbe desiderare di mappare l'immagine a una tavolozza fissa prima ("Per concludere" i colori). Questo è quello che uso:

convert 'http://i.stack.imgur.com/J2txV.png' -modulate 100,200,100 -remap 'http://i.stack.imgur.com/GvTqB.png' -format %c histogram:info:-|sort -r 
Problemi correlati