Определение цветов для изображения с использованием PHP - PullRequest
25 голосов
/ 11 октября 2011

Как я могу определить 2 верхних цвета изображения в PHP?

например, у меня есть это изображение:

enter image description here

Эта функция / процесс будетвозврат: 0000FF или синий и FFFF00 или ЖЕЛТЫЙ

Спасибо

Ответы [ 2 ]

21 голосов
/ 02 февраля 2012

Вот скрипт, который выдаст вам список:

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>';
0 голосов
/ 04 марта 2014

Если вы можете вызвать внешнюю утилиту, Imagemagick может сгенерировать для вас гистограмму.Вероятно, это будет намного быстрее, чем реализация PHP.

По сути, эта команда дает вам список цветов, отсортированных по наиболее доминирующим первым:

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

Возможно, вы захотите отобразитьсначала изображение в фиксированную палитру («округлить» цвета).Вот что я использую:

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
...