Обновить
Я также реализовал следующее решение в моем скрипте Python здесь, на GitHub .
Я также подтвердил, что поврежденные файлы (jpg) часто не являются «битыми» изображениями, т.е. поврежденный файл изображения иногда остается законным файлом изображения, исходное изображение потеряно или изменено, но вы все равно можете загрузить его без ошибок. Но усечение файла всегда вызывает ошибки.
Конец обновления
Вы можете использовать модуль Python Pillow (PIL) с большинством форматов изображений, чтобы проверить, является ли файл действительным и неповрежденным файлом изображения.
В случае, если вы стремитесь обнаруживать также битые изображения, @Nadia Alramli правильно предлагает im.verify()
метод, но он не обнаруживает все возможные дефекты изображения , например, im.verify
не обнаруживает усеченные изображения (которые большинство зрителей часто загружают с серой областью).
Pillow также может обнаруживать дефекты такого типа, но вы должны применить манипуляции с изображениями или декодировать / перекодировать изображение или запустить проверку. Напоследок предлагаю использовать этот код:
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 раз быстрее, чем обработка изображений (и я думаю, что переворот - одно из самых дешевых преобразований). С помощью этого кода вы собираетесь проверить набор изображений со скоростью около 10 МБ / с со стандартной подушкой или 40 МБ / с с модулем Pillow-SIMD (современный процессор x86_64 2,5 ГГц).
Для других форматов psd , xcf , .. вы можете использовать Imagemagick wrapper 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