Обновление
Я также реализовал следующее решение в своем скрипте Python здесь, на GitHub .
Я также подтвердил, что поврежденные файлы (jpg) часто не являются «испорченными» изображениями, т. Е. Поврежденный файл изображения иногда остается допустимым файлом изображения, исходное изображение потеряно или изменено, но вы все равно можете загрузить его без ошибок. , Но усечение файла всегда вызывает ошибки.
Окончание обновления
Вы можете использовать модуль Python Pillow (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 МБ / с со стандартной подушкой или 40 МБ / с с модулем Pillow-SIMD (современный процессор с частотой 2,5 ГГц x86_64).
Для других форматов 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