Подтвердить что ты не робот

Как проверить, является ли файл допустимым файлом изображения?

В настоящее время я использую PIL.

from PIL import Image
try:
    im=Image.open(filename)
    # do stuff
except IOError:
    # filename not an image file

Однако, хотя это в достаточной степени покрывает большинство случаев, некоторые файлы изображений, такие как, xcf, svg и psd, не обнаруживаются. Psd файлы генерируют исключение OverflowError.

Могу ли я как-нибудь их включить?

4b9b3361

Ответ 1

Много раз первые пары символов будут волшебным числом для различных форматов файлов. Вы можете проверить это в дополнение к вашей проверке исключений выше.

Ответ 2

Я только что нашел встроенный модуль imghdr. Из документации python:

Модуль imghdr определяет тип изображения, содержащегося в файле или байте поток.

Вот как это работает:

>>> import imghdr
>>> imghdr.what('/tmp/bass')
'gif'

Использование модуля намного лучше, чем переопределение аналогичной функциональности

Ответ 3

В дополнение к тому, что предлагает Брайан, вы можете использовать метод PIL verify, чтобы проверить, не поврежден ли файл.

im.verify()

Попытка определить, является ли файл сломанный, без фактического декодирования данные изображения. Если этот метод находит какой-либо проблем, он поднимает исключения. Этот метод работает только вновь открытое изображение; если изображение имеет уже загружен, результат undefined. Кроме того, если вам нужно загрузить образ после использования этого метода, вы должен снова открыть файл изображения. Атрибуты

Ответ 4

В Linux вы можете использовать python-magic (http://pypi.python.org/pypi/python-magic/0.1), который использует libmagic для идентификации форматов файлов.

AFAIK, libmagic просматривает файл и пытается рассказать вам об этом больше, чем просто формат, например размеры растровых изображений, формат версии и т.д. Таким образом, вы можете увидеть это как поверхностный тест на "достоверность".

Для других определений "valid" вам, возможно, придется написать свои собственные тесты.

Ответ 5

Вы можете использовать привязки Python к libmagic, python-magic, а затем проверить типы mime. Это не скажет вам, что файлы повреждены или нетронутыми, но он должен иметь возможность определить, какой тип изображения он имеет.

Ответ 6

Обновление

Я также реализовал следующее решение в своем скрипте 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 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

Ответ 7

Ну, я не знаю о внутренности psd, но я, конечно же, знаю, что, по сути, svg не является файлом изображения как таковым, - он основан на xml, так это, по существу, текстовый файл.

Ответ 8

В дополнение к проверке изображения PIL вы также можете добавить проверку расширения имени файла следующим образом:

filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif'))

Обратите внимание, что это только проверяет, имеет ли имя файла допустимое расширение изображения, фактически не открывает изображение, чтобы увидеть, является ли оно допустимым изображением, поэтому вам нужно дополнительно использовать PIL или одну из библиотек, предложенных в другие ответы.

Ответ 9

Будет ли проверка расширений файлов приемлемой или вы пытаетесь подтвердить, что сами данные представляют собой файл изображения?

Если вы можете проверить расширение файла, регулярное выражение или простое сравнение могут удовлетворить это требование.