用php检测空白生成的图像?

时间:2011-05-06 19:15:14

标签: php imagemagick

如何使用PHP和/或imagemagick检测图像是空白的(只有单个,任意颜色,或使用gif,随机任意颜色的帧)?

我认为这就是我要尝试的内容: http://www.php.net/manual/en/function.imagecolorat.php#97957

5 个答案:

答案 0 :(得分:2)

http://www.php.net/manual/en/function.imagecolorstotal.php为您提供图像中的颜色数量。嗯,在我的演示中似乎不起作用,抱歉:(我创建的图像(全红色,20x20像素)为PNG提供0种颜色,为GIF提供3种颜色。

好的:http://www.dynamicdrive.com/forums/showpost.php?p=161187&postcount=2查看第二段代码。在此测试:http://www.pendemo.nl/totalcolors.php

答案 1 :(得分:2)

凯文的解决方案可以使用随机抽样加速。如果您对像素应该与背景不同的百分比有所了解(假设您没有处理只有1个不同像素的大量图像),则可以使用泊松分布:

找到非空白像素的概率= 1 - e ^( - n * p)

其中n是要尝试的样本数,p是预期非空白的像素百分比。求解n以获得适当数量的样本以尝试:

n = -log(1 - x)/ p

其中x是所需概率,log是自然对数。例如,如果您有理由确定0.1%的图像应该是非空白的,并且您希望有99.99%的机会找到至少一个非空白像素,

n = -log(1-.9999)/。001 =需要9210个样本。

比检查每个像素快得多。要100%确定,如果抽样没有找到,您可以随时返回并检查所有这些。

答案 2 :(得分:1)

您可以使用imagecolorat检查PHP内部的图像(这可能很慢,但它可以工作):

function isPngValidButBlank($filename) {
  $img = imagecreatefrompng($filename);
  if(!$img)
    return false;
  $width = imagesx($img);
  $height = imagesy($img);
  if(!$width || !$height)
    return false;
  $firstcolor = imagecolorat($img, 0, 0);
  for($i = 0; $i < $width; $i++) { 
    for($j = 0; $j < $height; $j++) {
      $color = imagecolorat($img, $i, $j);
      if($color != $firstcolor)
        return false;
    }
  }
  return true;
}

答案 3 :(得分:1)

对于使用Imagick尝试实现此目标的任何人,getImageColors()方法都能解决问题。

https://www.php.net/manual/en/imagick.getimagecolors.php

    $img = new Imagick();
    $img->readImage($image);
    $colors = $img->getImageColors();
    if(!$colors > 1) {
        return false;
    }

答案 4 :(得分:0)

从每个图块的详细统计信息中获取标准偏差。如果标准偏差为0,则图像为一种颜色。

据说,“颜色数量”也会这样做;将是1。

使用-format选项:http://www.imagemagick.org/script/escape.php