2009-05-20 4 views
60

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

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

Однако, хотя это достаточно охватывает большинство случаев, некоторые файлы изображений, как, XCF, SVG и СДП не обнаруживаются. Файлы Psd генерируют исключение OverflowError.

Есть ли какой-нибудь способ включить их?

+19

Это не особенно распространена практика закрывать дубликаты через разные языки. Если вы не можете найти какие-либо другие вопросы Python с этим, оставьте его открытым, поскольку могут существовать решения, специфичные для Python, которые люди захотят опубликовать, что не дошло до вопроса, который вы опубликовали. –

+0

да, в первую очередь я действительно надеялся на python lib, о котором я не знал: P , а затем, как указал Бен, только магические числа не подтверждают полное изображение. – Sujoy

+0

@Sujoy, проверка всего изображения почти невозможна, если у вас уже нет его копии, потому что компьютер не может отличить правильный цветной пиксель от искаженного набора из 1s и 0s, если все (магические числа) правильны. – DevinB

ответ

8

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

+4

Этого будет недостаточно, если он действительно проверяет «правильные» изображения; наличие магического номера не гарантирует, что файл не был усечен, например. –

+0

отличный совет, теперь мне просто нужно выяснить, что это за числа. спасибо :) – Sujoy

+0

@ben, ouch я еще не думал об этом. Это действительно хорошая точка – Sujoy

1

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

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

+0

просто проверка расширения не достаточно, так как можно переименовать txt-файл как jpg или что-то в этом роде. я думаю, если я не смогу найти решение, только тогда я буду использовать проверку расширений для xcf и svg. – Sujoy

+0

Понятно, что я просто надеялся на некоторое разъяснение, прежде чем приступить к разработке решения, которое может наилучшим образом удовлетворить ваши потребности. Благодаря! – doomspork

2

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

+0

ага, вы правы. это xml. однако он содержит некоторые данные изображения, встроенные в него. – Sujoy

2

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

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

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

28

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

im.verify()

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

+0

хорошо, главная проблема заключается в том, что файлы svg, xcf и psd не могут быть открыты с помощью Image.open(), поэтому нет возможности проверить с помощью im.verify() – Sujoy

+11

Документация My God the PIL ужасна. Что такое «подходящее исключение»? – Timmmm

+0

Вот ссылка на [Документация по подушке для Image.verify()] (https://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.verify). К сожалению, это не лучше, и похоже, что они просто подняли абзац выше, ничего не добавив. –

3

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

134

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

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

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

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

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

+1

Да imghdr работает для большинства форматов изображений, но не для всех. согласно моей исходной проблеме с файлами svg, xcf и psd, ну, они также не обнаружены в imghdr. – Sujoy

+0

Да, но вместо того, чтобы изобретать колесо, с чего начать. –

+0

Вы можете, например, отказаться от необнаруженных заголовков изображений. Если изображение не было обнаружено imghdr, вероятно, также не поддерживается PIL. Или вы можете начать с изучения исходного кода imghdr и посмотреть, как он работает. –

Смежные вопросы