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

Pau*_*ulM 6 php imagemagick php-gd

我正在使用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";
}
?>
Run Code Online (Sandbox Code Playgroud)

有人看到这个潜在的陷阱吗?我想到了获得图像的最后几行,然后将r 127,128,129(灰色)的总和与其他颜色的总和进行比较.如果灰色大于其他颜色,则图像肯定会损坏.

意见欢迎!:)

Cas*_*alT 2

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

另一种选择是检查图像的最后几个像素(即右下角),看看它们是否与灰色完全匹配。如果是这样,请重新下载。(显然,如果您下载的图像在该角落实际上应该是灰色的,并且颜色完全相同,则这种方法会失败......但是如果您检查最后几个像素,它应该将这种可能性降低到可接受的水平)。