我正在使用Curl via Proxies用我开发的刮刀下载图像。
不幸的是,它得到的奇怪图像看起来像这些,最后一个是完全空白的:/
有没有人有办法确定图像是否具有大部分灰色或是完全空白/白色,这些确实是损坏的图像?
我已经在这里做了很多关于其他问题的检查,但我对其他解决方案没有太多运气。所以请注意建议这是重复的。
由于
在了解imgcolorat后,我进行了搜索并偶然发现了一些代码。我想出了这个:
<?php
$file = dirname(__FILE__) . "/images/1.jpg";
$img = imagecreatefromjpeg($file);
$imagew = imagesx($img);
$imageh = imagesy($img);
$xy = array();
$last_height = $imageh - 5;
$foo = array();
$x = 0;
$y = 0;
for ($x = 0; $x <= $imagew; $x++)
{
for ($y = $last_height;$y <= $imageh; $y++ )
{
$rgb = @imagecolorat($img, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
if ($r != 0)
{
$foo[] = $r;
}
}
}
$bar = array_count_values($foo);
$gray = (isset($bar['127']) ? $bar['127'] : 0) + (isset($bar['128']) ? $bar['128'] : 0) + (isset($bar['129']) ? $bar['129'] : 0);
$total = count($foo);
$other = $total - $gray;
if ($gray > $other)
{
echo "image corrupted \n";
}
else
{
echo "image not corrupted \n";
}
?>
有人看到一些潜在的陷阱吗?我想到了获得图像的最后几行,然后将r 127,128,129(灰色)的总和与其他颜色的总和进行比较。如果灰色大于其他颜色,则图像肯定会损坏。
欢迎提出意见! :)
答案 0 :(得分:4)
在寻找一种方法来检查这样的视觉损坏图像时找到了这个页面。这是一种使用bash解决问题的方法(无论如何,转换命令行可以很容易地适应php或python):
convert INPUTFILEPATH -gravity SouthWest -crop 20%x1% -format %c -depth 8 histogram:info:- | sed '/^$/d' | sort -V | head -n 1 | grep fractal | wc -l
在图片的西南角裁剪一个小方块,然后得到这张照片的直方图。如果直方图的主颜色具有名称“fractal”而不是rgb颜色,则表示此区域已损坏,因此输出将为1
和0
。
希望这有帮助!
答案 1 :(得分:2)
如果它返回的图像是有效文件,那么我建议运行两次刮擦(即下载两次并检查它们是否相同)。
另一种选择是检查图像的最后几个像素(即右下角),看它们是否与该灰色颜色完全匹配。如果他们这样做,那么重新下载。 (显然,如果您下载的图像在该角落实际上应该是灰色的,那么这种方法会失败,但是如果您检查几个最后一个像素,它应该会降低到达可接受水平的几率)。
答案 2 :(得分:2)
我用这个。如果右下角(5x5)的大部分像素都是灰色,则图像会被破坏。
define('MIN_WIDTH',500);
define('MIN_HEIGHT',200);
function isGoodImage($fn){
list($w,$h)=getimagesize($fn);
if($w<MIN_WIDTH || $h<MIN_HEIGHT) return 0;
$im=imagecreatefromstring(file_get_contents($fn));
$grey=0;
for($i=0;$i<5;++$i){
for($j=0;$j<5;++$j){
$x=$w-5+$i;
$y=$h-5+$j;
list($r,$g,$b)=array_values(imagecolorsforindex($im,imagecolorat($im,$x,$y)));
if($r==$g && $g==$b && $b==128)
++$grey;
}
}
return $grey<12;
}
答案 3 :(得分:0)
如果使用identify
选项调用它,ImageMagick的-verbose
命令将识别更多损坏的图像。并且还有一个-regard-warnings
选项,它会将警告视为错误。针对错误的图像尝试这些,并查看结果是否为非零错误代码。