6

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

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

3/4 损坏 狗坏了 房间损坏 全白

  • 当我通过 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

4 回答 4

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

它在图片的西南角裁剪一个小方块,然后得到这张图片的直方图。如果直方图的主要颜色名称为“分形”而不是 rgb 颜色,则表示该区域已损坏,因此输出将是10否则。

希望这可以帮助!

于 2013-10-11T14:37:23.917 回答
2

如果它返回的图像是有效文件,那么我建议运行两次抓取(即下载两次并检查它们是否相同)。

另一种选择是检查图像的最后几个像素(即右下角),看看它们是否与灰色的颜色完全匹配。如果他们这样做,然后重新下载。(显然,如果您下载的图像在那个角落实际上应该是灰色的,以那种确切的颜色......但如果您检查最后几个像素,它应该将这种可能性降低到可接受的水平)。

于 2012-01-24T22:23:59.053 回答
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;
    }
于 2014-02-13T09:28:18.180 回答
0

如果您使用该选项调用ImageMagick 的identify命令,它将识别出更多损坏的图像。-verbose还有一个-regard-warnings选项,它可以将警告视为错误。针对坏图像尝试这些,并查看结果是否为非零错误代码。

于 2016-10-19T11:02:54.647 回答