PHP:使用GD / Imagemagick确定通过Curl下载的视觉损坏图像(但仍然有效)

时间:2012-01-24 22:18:31

标签: php imagemagick php-gd

我正在使用Curl via Proxies用我开发的刮刀下载图像。

不幸的是,它得到的奇怪图像看起来像这些,最后一个是完全空白的:/

3/4 corrupted dog corrupted room corrupted completely white

  • 当我通过imagemagick(使用识别)测试图像时,它告诉我它们是有效的图像。
  • 当我再次通过exif_imagetype()和imagecreatefromjpeg()测试图像时,这两个函数都告诉我图像是有效的。

有没有人有办法确定图像是否具有大部分灰色或是完全空白/白色,这些确实是损坏的图像?

我已经在这里做了很多关于其他问题的检查,但我对其他解决方案没有太多运气。所以请注意建议这是重复的。

由于


在了解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(灰色)的总和与其他颜色的总和进行比较。如果灰色大于其他颜色,则图像肯定会损坏。

欢迎提出意见! :)

4 个答案:

答案 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颜色,则表示此区域已损坏,因此输出将为10

希望这有帮助!

答案 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选项,它会将警告视为错误。针对错误的图像尝试这些,并查看结果是否为非零错误代码。