如何知道图像中有多少种颜色?
Posted
技术标签:
【中文标题】如何知道图像中有多少种颜色?【英文标题】:How to know howmany colors are exist in the image? 【发布时间】:2014-08-20 09:07:19 【问题描述】:<?php
$img=imagecreatefrompng('dense.png');
list($width, $height)=getimagesize('dense.png');
$t=0;
for( $i=0 ; $i<$height ; $i++ )
for( $j=0 ; $j<$width ; $j++ )
$pix = imagecolorat($img, $i, $j);
$cols = imagecolorsforindex($img, $pix);
$r = $cols['red'];
$g = $cols['green'];
$b = $cols['blue'];
$pixel[$i][$j][0]=$r;
$pixel[$i][$j][1]=$g;
$pixel[$i][$j][2]=$b;
for( $i=0 ; $i<$height ; $i++ )
for( $j=0 ; $j<$width ; $j++ )
echo "(".$i.",".$j.") color of that pixel is (".$pixelcolor[$i][$j][0].",".$pixelcolor[$i][$j][1].",".$pixelcolor[$i][$j][2].").</p>";
echo"<br/>";
?>
这是我的代码,但是当我运行此代码时,它给了我空白网页。
我想创建一个数组来存储每个像素的 rgb 值,它还打印在网页上并减少数组中重复的值。
所以我想知道图像中有多少种颜色?
【问题讨论】:
空白页通常意味着致命错误。您的错误日志中有什么内容? 当我运行我的代码时,它会收到类似“TypeError: d.Analytics is undefined”的错误。 【参考方案1】:您的代码可能因内存耗尽错误而死。创建一百万左右的数组可能会导致这种情况。这是一个以相当有效的方式计算图像中唯一颜色数量的脚本(对于 PHP):
<?php
$path = "test.jpg";
$img = imagecreatefromjpeg($path);
$w = imagesx($img);
$h = imagesy($img);
// capture the raw data of the image
ob_start();
imagegd2($img, null, $w);
$data = ob_get_clean();
$totalLength = strlen($data);
// calculate the length of the actual pixel data
// from that we can derive the header size
$pixelDataLength = $w * $h * 4;
$headerLength = $totalLength - $pixelDataLength;
// use each four-byte segment as the key to a hash table
$counts = array();
for($i = $headerLength; $i < $totalLength; $i += 4)
$pixel = substr($data, $i, 4);
$count =& $counts[$pixel];
$count += 1;
$colorCount = count($counts);
echo $colorCount;
?>
$colorCount 是图像中唯一颜色的数量。 $counts 为您提供每种颜色出现的次数。每个 $key 是一个 4 字节的字符串。第一个字节是透明度。零值表示不透明。第二、三、四字节分别为R、G、B。您需要调用 ord() 来获取值。
【讨论】:
【参考方案2】:您可以使用 imagecolorstotal() 函数获取图像中的颜色总数
<?php
// Create image instance
$im = imagecreatefromgif('php.gif');
echo 'Total colors in image: ' . imagecolorstotal($im);
// Free image
imagedestroy($im);
?>
http://php.net/manual/en/function.imagecolorstotal.php
【讨论】:
但是当我使用这个函数来查找 png 图像上的颜色时,它给我的输出是“图像中的总颜色:0”。imagecolorstotal()
对于真彩色图像总是返回 0。有些人将真彩色图像转换为调色板而不是计算颜色,但这远非准确,因为在转换过程中会丢失很多颜色,这在将 32 位颜色转换为 24/16/8 位时是正常的。简而言之,函数imagecolorstotal()
在这件事上毫无用处。以上是关于如何知道图像中有多少种颜色?的主要内容,如果未能解决你的问题,请参考以下文章