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

Я использую Curl через 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"; } ?> 

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

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

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

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

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

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

Я использую этот. Если большая часть пикселей в правом нижнем углу (5×5) серая, изображение будет разбито.

  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; } 

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