Оновлення
Я також реалізував таке рішення в своєму скрипті 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 разів швидше, ніж виконання маніпуляцій із зображенням (і я думаю, що фліп - це одна з дешевих трансформацій). За допомогою цього коду ви збираєтеся перевірити набір зображень із швидкістю близько 10 Мбіт / сек із стандартною подушкою або 40 Мбіт / с за допомогою модуля Pillow-SIMD (сучасний процесор 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