Подтвердить что ты не робот

Обнаружение поврежденных изображений в bash script

У меня есть > 2000 изображений из потока веб-камеры (для временного видео), мне нужно удалить все неполные и поврежденные изображения, прежде чем передавать их в php-gd script, который редактирует их для окончательного видео.

Можно ли обнаружить поврежденные файлы с помощью imagemagick или какого-либо другого инструмента? Если я попытаюсь открыть поврежденное изображение с помощью feh, он отобразит libpng error: Read Error в консоли

Спасибо заранее!

ОБНОВЛЕНИЕ: Кажется, что предложенный метод идентификации принимает плохие изображения в моем случае. Вот пример поврежденного http://imgur.com/YcB9n

4b9b3361

Ответ 1

Попробуйте выполнить команду ImageMagick identify. На странице man:

Идентифицирует описание формата и характеристики одного или нескольких изображений файлы. Он также сообщит, если изображение является неполным или поврежденным.

Пример:

$ identify foo.png
identify: NotAPNGImageFile (foo.png).

$ echo $?
1

Альтернативой является использование PIL (библиотека изображений Python):

from PIL import Image

im = Image.open("foo.png")
im.verify()

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

im.verify()

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

Ответ 2

Я попробовал команду ImageMagick identify на jpg, в которой у меня было много разных видов коррупции. Он смог идентифицировать некоторые, но не все, поэтому это может быть просто частичным решением в лучшем случае, но попробуйте это:

for f in *.JPG ; do identify $f > /dev/null || echo $f >> /tmp/fail ; done ; cat /tmp/fail

Ответ 3

При условии

identify -ping IMAGE_NAME

имеет ненулевой код возврата для сломанного изображения, вы можете сделать это:

RESULTS_FILE=/tmp/failed_images
find . -name \*.png -exec identify -ping {} \; -or -exec echo {} \; > $RESULTS_FILE

Это приведет к отображению списка неудачных изображений $RESULTS_FILE. Изучите его, например, сравнивая количество результатов в файле с количеством изображений:

find . -name \*.png | wc -l
wc -l $RESULTS_FILE

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

cat $RESULTS_FILE | xargs rm -f