Обнаружение поврежденных изображений в bash script
У меня есть > 2000 изображений из потока веб-камеры (для временного видео), мне нужно удалить все неполные и поврежденные изображения, прежде чем передавать их в php-gd script, который редактирует их для окончательного видео.
Можно ли обнаружить поврежденные файлы с помощью imagemagick или какого-либо другого инструмента? Если я попытаюсь открыть поврежденное изображение с помощью feh, он отобразит libpng error: Read Error
в консоли
Спасибо заранее!
ОБНОВЛЕНИЕ: Кажется, что предложенный метод идентификации принимает плохие изображения в моем случае. Вот пример поврежденного http://imgur.com/YcB9n
Ответы
Ответ 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