使用 PHP 检测图像的颜色

发布于 2024-12-09 00:55:44 字数 238 浏览 0 评论 0 原文

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

例如我有这个图像:

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

谢谢

How can I detect the top 2 colors of an Image in PHP?

for example I have this image:

enter image description here

This function/process will return: 0000FF or blue and FFFF00 or YELLOW

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我爱人 2024-12-16 00:55:44

这是一个将为您提供列表的脚本:

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

Here's a script that will give you the list:

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>';
早乙女 2024-12-16 00:55:44

如果您可以调用外部实用程序,Imagemagick 可以为您生成直方图。它可能会比 PHP 实现快得多。

基本上,此命令为您提供一个颜色列表,首先按最主要的顺序排序:

convert 'https://i.sstatic.net/J2txV.png' -format %c histogram:info:-|sort -r

您可能希望首先将图像映射到固定调色板(“舍入”颜色)。这就是我使用的:

convert 'https://i.sstatic.net/J2txV.png' -modulate 100,200,100 -remap 'https://i.sstatic.net/GvTqB.png' -format %c histogram:info:-|sort -r

If you are OK to call an external utility, Imagemagick can generate a histogram for you. It's probably going to be much faster than a PHP implementation.

Basically, this command gives you a list of colours, sorted by most dominant first:

convert 'https://i.sstatic.net/J2txV.png' -format %c histogram:info:-|sort -r

You might want to map the image to a fixed palette first ("Round off" the colours). This is what I use:

convert 'https://i.sstatic.net/J2txV.png' -modulate 100,200,100 -remap 'https://i.sstatic.net/GvTqB.png' -format %c histogram:info:-|sort -r
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文