6

プロキシ経由でカールを使用して、開発したスクレーパーで画像をダウンロードしています。

残念ながら、これらのような奇妙な画像が得られ、最後の画像は完全に空白です:/

3/4 破損 犬が壊れた 部屋が壊れた 完全に白

  • imagemagick (identify を使用) で画像をテストすると、それらが有効な画像であることがわかります。
  • 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

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 に答える
2

返された画像が有効なファイルである場合は、スクレイプを 2 回実行することをお勧めします (つまり、2 回ダウンロードして、それらが同じかどうかを確認します)。

別のオプションは、画像の最後の数ピクセル (つまり、右下隅) をチェックして、それらがそのグレーの色と正確に一致するかどうかを確認することです。その場合は、再ダウンロードしてください。(明らかに、このアプローチは、実際にはその隅が灰色であると想定されている画像をその正確な色でダウンロードすると失敗します...しかし、最後のピクセルのいくつかをチェックすると、その可能性を許容レベルまで減らすはずです)。

于 2012-01-24T22:23:59.053 に答える