Как программно проверить, повреждено ли изображение (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% уверен, что в моей толпе коллекции есть более больные изображения.

Ответ 1

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

from PIL import Image

v_image = Image.open(file)
v_image.verify()

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

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

im.verify()

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

Ответ 2

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

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

Ответ 3

В 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 возвращается, еслитип изображения не поддерживается, данные не в распознанном формате, или изображение повреждено и не может быть загружено.

Ответ 4

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

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

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

Ответ 5

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

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

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

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

identify myfile.jpg