PHP: Определите визуально поврежденные изображения (пока действительные), загруженные через Curl с помощью GD / Imagemagick - PullRequest
6 голосов
/ 25 января 2012

Я использую Curl через Proxies для загрузки изображений с разработанным мной скребком.

К сожалению, он получает странное изображение, которое выглядит примерно так, а последнее полностью пустое: /

3/4 corrupted dog corrupted room corrupted completely white

  • Когда я тестирую изображения с помощью imagemagick (используя идентификацию), он говорит мне, что они действительные изображения.
  • Когда яснова протестируйте изображения с помощью exif_imagetype () и imagecreatefromjpeg (), обе эти функции сообщают мне, что изображения действительны.

У кого-нибудь есть способ определить, имеет ли изображение большую часть серого цвета или оно полностью пустое?/ white а это действительно испорченные изображения?

Я много раз проверял здесь другие вопросы, но мне не повезло с другими решениями.Поэтому, пожалуйста, позаботьтесь о том, чтобы предположить, что это дубликат.

Спасибо


Узнав об 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";
}
?>

Кто-нибудь видел некоторые потенциальные подводные камни с этим?Я подумал о том, чтобы получить последние несколько строк изображения и затем сравнить итоговое значение 127 127 128 (серого цвета) с общим количеством других цветов.Если серый цвет больше, чем другие цвета, изображение, несомненно, повреждено.

Мнения приветствуются!:)

Ответы [ 4 ]

4 голосов
/ 11 октября 2013

нашел эту страницу, когда искал способ проверить визуально поврежденные изображения, как это. Вот способ решения проблемы с использованием bash (во всяком случае, командную строку convert можно легко адаптировать для 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, это означает, что эта зона повреждена и поэтому выходные данные будут 1 и 0 в противном случае.

Надеюсь, это поможет!

2 голосов
/ 13 февраля 2014

Я использую это.Если большинство пикселей в правом нижнем углу (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;
    }
2 голосов
/ 25 января 2012

Если изображение, которое оно возвращает, является допустимым файлом, то я бы порекомендовал запустить очистку дважды (т.е. загрузить его дважды и проверить, совпадают ли они).

Другой вариант - проверить последние несколько пикселей изображения (т.е. нижний правый угол), чтобы убедиться, что они точно соответствуют этому цвету серого. Если они это сделают, то перезагружаем. (очевидно, что этот подход не работает, если вы загружаете изображение, которое на самом деле должно быть серым в этом углу, в этом точном цвете ... но если вы проверите несколько последних пикселей, это должно уменьшить вероятность этого до приемлемого уровня).

0 голосов
/ 19 октября 2016

Команда identify ImageMagick будет определять гораздо больше поврежденных изображений, если вы вызываете его с опцией -verbose.Также есть опция -regard-warnings, которая заставляет обрабатывать предупреждения как ошибки.Попробуйте их на плохое изображение, и посмотрите, если результат будет ненулевой код ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...