使用PHP检测图像的颜色

27

如何在PHP中检测图像的前2个颜色?

例如,我有这张图片:

enter image description here

该函数/过程将返回:0000FF蓝色FFFF00黄色

谢谢


2
这可能适合您:https://dev59.com/WnA75IYBdhLWcg3wGlIa - samn
谢谢,太棒了。你能把它作为答案吗? - Tech4Wilco
2个回答

24

这是一个能够给你列表的脚本:

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>';

4
我建议通过替换Switch Case语句为$img = @imagecreatefromstring(file_get_contents($image));来进行优化,以便能够高效地处理不同类型的图像... - Andres
这看起来像是在循环中获取每个像素的颜色值。如果IMagick可用,我认为可能抓取图像直方图会更有效率。http://php.net/manual/en/imagick.getimagehistogram.php - GordonM
为什么需要使用0X33进行四舍五入?(round(round(($rgb['red'] / 0x33)) * 0x33))) - Michael Mulik

0

如果您可以调用外部实用程序,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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接