我该如何使用 PHP 和/或 ImageMagick 检测一张图片是否为空(只有单一任意颜色或者对于 gif 图片,随机的任意颜色帧)?
我认为我可以尝试以下方法:http://www.php.net/manual/en/function.imagecolorat.php#97957
我该如何使用 PHP 和/或 ImageMagick 检测一张图片是否为空(只有单一任意颜色或者对于 gif 图片,随机的任意颜色帧)?
我认为我可以尝试以下方法:http://www.php.net/manual/en/function.imagecolorat.php#97957
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;
}
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
使用随机抽样可以加快Kevin的解决方案。如果你对与背景不同的像素的百分比有一些想法(假设你没有处理仅有1个不同像素的大量图像),则可以使用泊松分布:
找到非空像素的概率= 1-e^(-n*p)
其中,n是要尝试的样本数量,p是预计为非空像素的百分比。 解出n以获得适当的尝试样本数量:
n = -log(1 - x) / p
其中x是所需的概率,log是自然对数。例如,如果您相信图像中应该有0.1%的非空像素,并且您想有99.99%的机会找到至少一个非空像素,则需要进行9210次采样。
比检查每个像素要快得多。如果抽样未找到任何内容,您始终可以返回并检查所有内容,以确保100%正确。
如果你正在使用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;
}
从每个图块的详细统计数据中获取标准差。如果标准差为0,则图像为单色。
据说,“颜色数量”也会这样做;将是1。
使用-format
选项:http://www.imagemagick.org/script/escape.php