如何知道图像中有多少种颜色?

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() 在这件事上毫无用处。

以上是关于如何知道图像中有多少种颜色?的主要内容,如果未能解决你的问题,请参考以下文章

在 geoTIFF 中获取所有唯一颜色时,如何知道 PIL 指的是啥颜色?

用另一种颜色替换图像中的特定颜色

Photoshop中一个8位图支持的颜色有多少种?

分析图像的颜色

如何根据颜色值聚类彩色图像? [关闭]

图像/颜色操作公式