В настоящее время я использую PIL.
from PIL import Image
try:
im=Image.open(filename)
# do stuff
except IOError:
# filename not an image file
Однако, хотя этого достаточно для большинства случаев, некоторые файлы изображений, такие как xcf, svg и psd, не обнаруживаются. Файлы Psd вызывают исключение OverflowError.
Могу ли я как-нибудь включить их?
python
image
identification
imghdr
Суджой
источник
источник
Ответы:
Часто первая пара символов будет магическим числом для различных форматов файлов. Вы можете проверить это в дополнение к проверке исключений выше.
источник
Я только что нашел встроенный модуль imghdr . Из документации python:
Вот как это работает:
Использование модуля намного лучше, чем повторная реализация аналогичной функции
источник
imghdr.what(path)
возвращается,None
если указанpath
нераспознанный тип файла изображения. Список распознаваемых в настоящее время типов изображений: rgb , gif , pbm , pgm , ppm , tiff , rast , xbm , jpeg , bmp , png , webp , exr .Помимо того , что Брайан предполагая , вы можете использовать PIL это проверить метод , чтобы проверить , если файл разбит.
источник
В дополнение к
PIL
проверке изображения вы также можете добавить проверку расширения имени файла следующим образом:Обратите внимание, что это только проверяет, имеет ли имя файла допустимое расширение изображения, оно фактически не открывает изображение, чтобы увидеть, является ли оно действительным изображением, поэтому вам необходимо использовать дополнительно
PIL
или одну из библиотек, предложенных в других ответах.источник
from PIL import Image img = Image.open(filename) print(img.format)
а затем проверить его следующим образом:img.format.lower() in ['png', 'jpg', 'jpeg', 'tiff', 'bmp', 'gif']
Обновить
Я также реализовал следующее решение в моем скрипте Python здесь, на GitHub .
Я также подтвердил, что поврежденные файлы (jpg) часто не являются «битыми» изображениями, т.е. поврежденный файл изображения иногда остается законным файлом изображения, исходное изображение потеряно или изменено, но вы все равно можете загрузить его без ошибок. Но усечение файла всегда вызывает ошибки.
Конец обновления
Вы можете использовать модуль Python Pillow (PIL) с большинством форматов изображений, чтобы проверить, является ли файл действительным и неповрежденным файлом изображения.
В случае, если вы стремитесь обнаруживать также битые изображения, @Nadia Alramli правильно предлагает
im.verify()
метод, но он не обнаруживает все возможные дефекты изображения , например,im.verify
не обнаруживает усеченные изображения (которые большинство зрителей часто загружают с серой областью).Pillow также может обнаруживать дефекты такого типа, но вы должны применить манипуляции с изображениями или декодировать / перекодировать изображение или запустить проверку. Напоследок предлагаю использовать этот код:
В случае дефектов изображения этот код вызовет исключение. Учтите, что im.verify примерно в 100 раз быстрее, чем обработка изображений (и я думаю, что переворот - одно из самых дешевых преобразований). С помощью этого кода вы собираетесь проверить набор изображений со скоростью около 10 МБ / с со стандартной подушкой или 40 МБ / с с модулем Pillow-SIMD (современный процессор x86_64 2,5 ГГц).
Для других форматов psd , xcf , .. вы можете использовать Imagemagick wrapper Wand , код следующий:
Но, судя по моим экспериментам, Wand не обнаруживает усеченные изображения, я думаю, что он загружает недостающие части в виде серой области без запроса.
Я отмечаю, что Imagemagick имеет внешний идентификатор команды, который может выполнить задание, но я не нашел способа вызвать эту функцию программно и не тестировал этот маршрут.
Я предлагаю всегда выполнять предварительную проверку, проверять, чтобы размер файла не был нулевым (или очень маленьким), это очень дешевая идея:
источник
В Linux вы можете использовать python-magic ( http://pypi.python.org/pypi/python-magic/0.1 ), который использует libmagic для определения форматов файлов.
AFAIK, libmagic просматривает файл и пытается рассказать вам о нем больше, чем просто формат, например размеры растрового изображения, версию формата и т. Д. Так что вы можете рассматривать это как поверхностный тест на «достоверность».
Для других определений «действительного» вам, возможно, придется написать свои собственные тесты.
источник
Вы можете использовать привязки Python к libmagic, python-magic, а затем проверить типы mime. Он не скажет вам, повреждены ли файлы или нет, но он сможет определить, какой это тип изображения.
источник
Что ж, я не знаю, как устроен psd, но я, конечно, знаю, что, по сути, svg не является файлом изображения как таковым, он основан на xml, поэтому, по сути, это простой текстовый файл.
источник
Один из вариантов - использовать
filetype
пакет.Монтаж
python -m pip install filetype
Преимущества
Пример решения
Дополнительная информация об официальном репо: https://github.com/h2non/filetype.py
источник
Будет ли приемлемой проверка расширений файлов или вы пытаетесь подтвердить, что сами данные представляют собой файл изображения?
Если вы можете проверить расширение файла, регулярное выражение или простое сравнение могут удовлетворить требование.
источник
источник