Как загрузить изображение и извлечь данные Exif с помощью Python PIL?

#python #python-imaging-library #exif

#python #python-imaging-library #exif

Вопрос:

Я пытаюсь прочитать данные Exif из загруженного изображения. Я сохраняю изображение на свой компьютер в одной функции, затем пытаюсь прочитать данные в другой функции, но продолжаю получать ошибку bad mode. Я смог прочитать данные из предварительно сохраненного изображения и просто использовал ._getexif() но когда я пытаюсь сделать то же самое с загружаемым изображением, оно не работает. Что я делаю не так?

Вот цикл, который вызывает две функции.

 else:
    imgTags = findImages(url)
    for imgTag in imgTags:
        imgFileName = downloadImage(imgTag)
        testForExif(imgFileName)
  

Найдите и загрузите изображения со страницы

 def findImages(url):
    print '[*] Finding images on '   url
    urlContent = urllib2.urlopen(url).read()
    soup = BeautifulSoup(urlContent)
    imgTags = soup.findAll('img')
    return imgTags

def downloadImage(imgTag):
    try:
        print '[ ] Downloading image...'
        imgSrc = imgTag['src']
        imgContent = urllib2.urlopen(imgSrc).read()
        imgFileName = basename(urlsplit(imgSrc)[2])
        imgFile = open(imgFileName, 'wb')
        imgFile.write(imgContent)
        imgFile.close()
        return imgFileName
    except:
        return ''
  

Прочитайте данные exif

 def testForExif(imgFileName):
    exifData = {}
    imgFile = Image.open(imgFileName, 'rb')
    info = imgFile._getexif()
    print 'nn'   str(info)   'nn'
    if info:
        for (tag, value) in info.items():
            decoded = TAGS.get(tag, tag)
            exifData[decoded] = value
        exifGPS = exifData['GPSInfo']
        if exifGPS:
            print '[ ] '   imgFileName   ' contains GPS MetaData'
  

Я полагаю, что ошибка «плохого режима» возникает в функции testsForExif, где-то в первых двух строках. Он никогда не доходит до первого оператора печати.

Точная ошибка, которую я получаю, такова.

Ошибка значения: неправильный режим

Трассировка (последний последний вызов): файл «C:UsersHeyNowDownloadsPythonCookbookForensicsmetaurl.py «, строка 59, в файле main() «C:UsersHeyNowDownloadsPythonCookbookForensicsmetaurl.py «, строка 56, в основном файле testForExif(imgFileName) «C:UsersHeyNowDownloadsPythonCookbookForensicsmetaurl.py «, строка 31, в testForExif imgFile = Image.open(imgFileName, ‘rb’) Файл «C:Python27libsite-packagesPILImage.py «, строка 1947, в open raise ValueError(«плохой режим») ValueError: плохой режим

Играя с ним, я также получил.

Плохой режим ‘rb’, имя файла;

Также ошибка.

Я потерялся.

РЕДАКТИРОВАТЬ: если я изменю:

 imgFile = Image.open(imgFileName, 'rb')
  

Для

 imgFile = Image.open(imgFileName)
  

Я получаю AttributeError: _getexif()
Трассировка:

Трассировка (последний последний вызов): файл «C:UsersHeyNowDownloadsPythonCookbookForensicsmetaurl.py «, строка 59, в файле main() «C:UsersHeyNowDownloadsPythonCookbookForensicsmetaurl.py «, строка 56, в основном файле testForExif(imgFileName) «C:UsersHeyNowDownloadsPythonCookbookForensicsmetaurl.py «, строка 32, в файле testForExif info = imgFile._getexif() «C:Python27libsite-packagesPILImage.py «, строка 512, вgetattr вызывает ошибку атрибута (имя) Ошибка атрибута: _getexif

Комментарии:

1. пожалуйста, всегда включайте обратную трассировку

2. какой у вас тип изображения? изображения png не содержат данных exif

Ответ №1:

Я думаю, вы получаете ошибки из-за того, как работает «downloadImages». Вы просто возвращаете пустую строку в случае возникновения каких-либо ошибок. Однако, вернувшись в свой тест, если вы не проверяете, не является ли имя файла пустой строкой, прежде чем пытаться его открыть.

 Image.open('') 
  

приведет к тому, что imgfile будет None. Итак, у него нет атрибутов, и вы получаете ошибку атрибута.

Вероятно, в вашем синтаксическом анализе веб-страницы или обработке имен файлов есть какая-то ошибка, которая выдает ошибки. Неправильно обрабатывать ошибки — это очень плохой тон, и в этом случае это приводит к тому, что ваша программа вообще не функционирует. У вас есть оператор try / except, но вы просто продолжаете, даже если есть ошибки. Что вам нужно сделать, это изменить предложение except, чтобы пропустить это имя файла, если есть ошибки (или оно равно null). Надеюсь, это поможет.

Редактировать:

Попробуйте печатать свои переменные по ходу работы (например, имена файлов), чтобы убедиться, что они верны и изображения существуют. Это также может быть проблемой типов файлов. Например, возможно, ваш скрипт находит некоторые файлы изображений, отличные от jpg, и пытается открыть данные exif в bmp или что у вас есть.

Комментарии:

1. Спасибо… и на данный момент все помогает. 🙂 Но я знаю, что он находит изображения на странице, потому что он их загружает. Похоже, что он проходит мимо функции загрузки изображения. Также я убрал аспект try / except, и он по-прежнему делает то же самое.

Ответ №2:

Вам не нужно слишком определять rb режим, просто используйте:

 Image.open(imgFileName)
  

Единственный Image.open() приемлемый режим — это r режим (который используется по умолчанию). Смотрите здесь

Комментарии:

1. Я пробовал это таким образом, но все равно выдает ту же ошибку.