Я использовал модуль Pyhton Pillow (PIL) и оберточную палочку Imagemagick (для форматов psd, xcf), чтобы обнаружить поврежденные изображения, исходный ответ с фрагментами кода здесь .
Я также реализовал это решение в своем скрипте Python здесь, на GitHub .
Я также убедился, что поврежденные файлы (jpg) часто не являются «испорченными» изображениями, т. Е. Иногда остается поврежденный файл изображениязаконный файл изображения, исходное изображение потеряно или изменено, но вы все равно можете его загрузить.
Я цитирую полный ответ для полноты:
Вы можете использовать Python Подушка *Модуль 1014 * (PIL), с большинством форматов изображений, для проверки того, является ли файл действительным и неповрежденным файлом изображения.
В случае, если вы хотите обнаружить также поврежденные изображения, @Nadia Alramli правильно предложит im.verify()
метод, но этот не обнаруживает все возможные дефекты изображения , например, im.verify
не обнаруживает усеченные изображения (которые большинство зрителей часто загружают с серой областью).
Подушка также может обнаруживать дефекты этого типа, но вы должны применить манипуляцию с изображением или декодировать / перекодировать изображение, чтобы запустить проверку.Наконец, я предлагаю использовать этот код:
try:
im = Image.load(filename)
im.verify() #I perform also verify, don't know if he sees other types o defects
im.close() #reload is necessary in my case
im = Image.load(filename)
im.transpose(PIL.Image.FLIP_LEFT_RIGHT)
im.close()
except:
#manage excetions here
В случае дефектов изображения этот код вызовет исключение.Пожалуйста, учтите, что im.verify примерно в 100 раз быстрее, чем выполнение манипуляций с изображениями (и я думаю, что flip - это одно из самых дешевых преобразований).С помощью этого кода вы будете проверять набор изображений со скоростью около 10 МБ / с (современный процессор с частотой 2,5 ГГц x86_64).
Для других форматов psd , xcf , .. вы можете использовать Imagemagick обертку Wand , код выглядит следующим образом:
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
Но, из моих экспериментов Wand не обнаруживает усеченные изображения,Я думаю, что он загружает недостающие части в виде серой области без запроса.
Я сообщаю, что Imagemagick имеет внешнюю команду определяет , что может выполнить задание, но я не нашел способа вызвать эту функциюпрограммно, и я не тестировал этот маршрут.
Я предлагаю всегда выполнять предварительную проверку, проверьте размер файла , чтобы он не был нулевым (или очень маленьким), это очень дешево идея:
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case