Détection de couleurs pour une Image en utilisant PHP

Comment puis-je détecter les 2 meilleures couleurs d'une Image en PHP?

, Par exemple j'ai cette image:

entrez la description de l'image ici

Cette fonction/processus de retour: 0000FF ou bleu et FFFF00 ou JAUNE

Merci

25
demandé sur Tech4Wilco 2011-10-11 18:41:02

2 réponses

Voici un script qui vous donnera la liste:

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>';
21
répondu rcs20 2012-02-02 14:42:17

Si vous êtes autorisé à appeler un utilitaire externe, Imagemagick peut générer un histogramme pour vous. Cela va probablement être beaucoup plus rapide qu'une implémentation PHP.

Fondamentalement, cette commande vous donne une liste de couleurs, triées par les plus dominantes en premier:

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

Vous pouvez d'abord mapper l'image sur une palette fixe ("arrondir" les couleurs). C'est ce que j'utilise:

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
0
répondu troelskn 2014-03-04 10:19:48