Как программно проверить, повреждено ли изображение (PNG, JPEG или GIF)?

Хорошо. Таким образом, у меня есть около 250 000 изображений с высоким разрешением. То, что я хочу сделать, это пройти через все из них и найти те, которые повреждены. Если вы знаете, что такое 4scrape, то вы знаете природу изображений I.

Поврежден, для меня, изображение загружается в Firefox, и это говорит

The image “such and such image” cannot be displayed, because it contains errors.

Теперь я мог выбрать все мои 250 000 изображений (~ 150 гб) и перетащить их в Firefox. Это было бы плохо, хотя, потому что я не думаю, что Mozilla разработала Firefox для открытия 250 000 вкладок. Нет, мне нужен способ программно проверить, повреждено ли изображение.

Кто-нибудь знает библиотеку PHP или Python, которая может что-то сделать в этом направлении? Или существующая часть программного обеспечения для Windows?

Я уже удалил явно поврежденные изображения (например, те, что равны 0 байтам), но я уверен, что на 99,9% есть более больные изображения, которые плавают вокруг в моей толпе коллекции.

Простым способом было бы попробовать загрузить и проверить файлы с помощью PIL (Python Imaging Library).

 from PIL import Image v_image = Image.open(file) v_image.verify() 

Поймать исключения …

Из документации :

im.verify ()

Попытка определить, поврежден ли файл, без фактического декодирования данных изображения. Если этот метод обнаруживает какие-либо проблемы, он вызывает соответствующие исключения. Этот метод работает только на вновь открывшемся изображении; если изображение уже загружено, результат не определен. Кроме того, если вам нужно загрузить изображение после использования этого метода, вы должны снова открыть файл изображения.

я предлагаю вам проверить imagemagick для этого: http://www.imagemagick.org/

там у вас есть инструмент под названием ident, который вы можете использовать в сочетании со сценарием / stdout или вы можете использовать интерфейс программирования

В PHP с exif_imagetype () :

 if (exif_imagetype($filename) === false) { unlink($filename); // image is corrupted } 

EDIT : или вы можете попытаться полностью загрузить изображение с помощью ImageCreateFromString () :

 if (ImageCreateFromString(file_get_contents($filename)) === false) { unlink($filename); // image is corrupted } 

Ресурс изображения будет возвращен при успешном завершении. FALSE возвращается, если тип изображения не поддерживается, данные не находятся в распознанном формате или изображение повреждено и не может быть загружено.

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

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

Однако многие изображения могут не отображаться просто потому, что они растягивают часть формата файла, которую конкретный зритель, с которым вы используете, не могут обрабатывать (в GIF, в частности, есть много этих краевых случаев, но вы можете найти JPEG и редкий PNG-файл которые могут отображаться только в определенных зрителях). Также есть некоторые уродливые случаи с краем JPEG, когда файл выглядит неповрежденным в средстве просмотра X, но на самом деле файл был прерван и отображается только правильно, потому что очень мало информации было потеряно (FireFox может показать некоторые отрезанные файлы JPEG правильно [ вы получаете серое дно], но другие приводят к тому, что FireFox кажется загруженным на полпути, а затем отображает сообщение об ошибке вместо частичного изображения)

Вы можете использовать imagemagick, если он доступен:

если вы хотите сделать целую папку

 identify "./myfolder/*" >log.txt 2>&1 

если вы хотите просто проверить файл:

 identify myfile.jpg