Обновить
Я также реализовал следующее решение в моем скрипте 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 оболочку Wand, код выглядит следующим образом :
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
Но, судя по моим экспериментам, Wand не обнаруживает усеченные изображения, я думаю, что он загружает недостающие части в виде серой области без запроса.
Я красный, что Imagemagick имеет внешнюю команду identify, которая может выполнить задание, но я не нашел способа вызвать эту функцию программно, и я не тестировали этот маршрут.
Я предлагаю всегда выполнять предварительную проверку, проверять, чтобы размер файла не был нулевым (или очень маленьким), это очень дешевая идея:
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case
person
Fabiano Tarlao
schedule
25.11.2018