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

用php检测空白生成的图像?,php,imagemagick,Php,Imagemagick,如何使用PHP和/或imagemagick检测图像是否为空白(仅为单一任意颜色,或者gif中为随机任意颜色的帧) 我想这就是我要尝试的: 提供图像中颜色的数量。嗯,在我的演示中,它似乎不起作用,对不起:(我创建的一个图像(完全红色,20x20像素)为PNG提供0种颜色,为GIF提供3种颜色 好:http://www.dynamicdrive.com/forums/showpost.php?p=161187&postcount=2查看第二段代码。此处测试:http://www.pendemo.nl

如何使用PHP和/或imagemagick检测图像是否为空白(仅为单一任意颜色,或者gif中为随机任意颜色的帧)

我想这就是我要尝试的: 提供图像中颜色的数量。嗯,在我的演示中,它似乎不起作用,对不起:(我创建的一个图像(完全红色,20x20像素)为PNG提供0种颜色,为GIF提供3种颜色


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

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

据推测,“颜色数”也会这样做;应该是1


使用
-format
选项:

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

函数ispngValidButbank($filename){
$img=imagecreatefrompng($filename);
如果(!$img)
返回false;
$width=imagesx($img);
$height=imagesy($img);
如果(!$width |!$height)
返回false;
$firstcolor=imagecolorat($img,0,0);
对于($i=0;$i<$width;$i++){
对于($j=0;$j<$height;$j++){
$color=imagecolorat($img,$i,$j);
如果($color!=$firstcolor)
返回false;
}
}
返回true;
}

使用随机采样可以加快Kevin的解决方案。如果您对与背景不同的像素百分比有一些想法(假设您没有处理大量只有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%确定的是,如果采样没有找到任何像素,您可以随时返回并检查所有像素。

对于任何使用Imagick尝试实现这一点的人,GetImageColor()方法完成了这一任务


听起来很复杂。祝你好运!“返回图像调色板中的颜色数。”注意调色板这个词。是的,至少它更近了一步,哈哈;-)好的,找到了一段有效的代码。看看上面贴的最后一段。对PNG有效。在这之后,我使用了感知哈希:()。使用该方法,空白(或大部分空白)图像的哈希值之和应为0或1。
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;
}
    $img = new Imagick();
    $img->readImage($image);
    $colors = $img->getImageColors();
    if(!$colors > 1) {
        return false;
    }