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

时间:2014-08-20 09:07:20

标签: php jquery gd imagick

<?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值的数组,它也会在网页上打印并减少数组中重复的值。

所以我想知道图片中有多少种颜色?

2 个答案:

答案 0 :(得分: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()来获取值。

答案 1 :(得分:0)

您可以使用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