Как программно проверить, не повреждено ли изображение (PNG, JPEG или GIF)? - PullRequest
17 голосов
/ 09 сентября 2009

Хорошо. Итак, у меня есть около 250000 изображений с высоким разрешением. То, что я хочу сделать, это просмотреть все из них и найти те, которые повреждены. Если вы знаете, что такое 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% уверен, что в моей толпе коллекции есть больше больных изображений.

Ответы [ 5 ]

23 голосов
/ 09 сентября 2009

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

from PIL import Image

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

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

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

im.verify ()

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

6 голосов
/ 09 сентября 2009

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

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

5 голосов
/ 10 сентября 2009

В PHP с exif_imagetype () :

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

РЕДАКТИРОВАТЬ : или вы можете попробовать полностью загрузить изображение с помощью ImageCreateFromString () :

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

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

3 голосов
/ 09 сентября 2009

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

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

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

0 голосов
/ 25 февраля 2010

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

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

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

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

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