【问题标题】:How do you download an image and extract Exif data using Python PIL?如何使用 Python PIL 下载图像并提取 Exif 数据?
【发布时间】:2014-08-13 18:21:36
【问题描述】:

我正在尝试从下载的图像中读取 Exif 数据。我在一个函数中将图像保存到我的计算机,然后尝试在另一个函数中读取数据,但我不断收到错误模式错误。我已经能够从预先保存的图像中读取数据并且只使用了 ._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 '\n\n' + str(info) + '\n\n'
    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 函数中触发的,位于前几行的某处。它永远不会出现在第一个打印语句中。

我得到的确切错误是。

ValueError:错误模式

Traceback(最近一次调用最后一次):文件 “C:\Users\HeyNow\Downloads\Python\Cookbook\Forensics\metaurl.py”,行 59,在 main() 文件“C:\Users\HeyNow\Downloads\Python\Cookbook\Forensics\metaurl.py”,行 56,主要是 testForExif(imgFileName) 文件“C:\Users\HeyNow\Downloads\Python\Cookbook\Forensics\metaurl.py”,行 31、在testForExif中 imgFile = Image.open(imgFileName, 'rb') 文件“C:\Python27\lib\site-packages\PIL\Image.py”,第 1947 行,打开 raise ValueError("bad mode") ValueError: bad mode

通过玩它我也得到了一个。

坏模式'rb',文件名;

还有错误。

我迷路了。

编辑:如果我改变:

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

imgFile = Image.open(imgFileName)

我得到AttributeError: _getexif() 追溯:

Traceback(最近一次调用最后一次):文件“C:\Users\HeyNow\Downloads\Python\Cookbook\Forensics\metaurl.py”,行 59,在 main() 文件“C:\Users\HeyNow\Downloads\Python\Cookbook\Forensics\metaurl.py”,行 56,主要是 testForExif(imgFileName) 文件“C:\Users\HeyNow\Downloads\Python\Cookbook\Forensics\metaurl.py”,行 32、在testForExif中 info = imgFile._getexif() 文件“C:\Python27\lib\site-packages\PIL\Image.py”,第 512 行,在 getattr 中 raise AttributeError(name) AttributeError: _getexif

【问题讨论】:

  • 请始终包含回溯
  • 你的图片类型是什么? png 图像没有 exif 数据

标签: python python-imaging-library exif


【解决方案1】:

您不需要太定义rb 模式,只需使用:

Image.open(imgFileName)

Image.open() 接受的唯一模式是r 模式(默认)。见here

【讨论】:

  • 我已经尝试过,仍然给我同样的错误。
【解决方案2】:

我认为由于“downloadImages”的工作方式,您会遇到错误。如果出现任何类型的错误,您只是返回一个空字符串。但是,回到您的 testforex 中,如果您在尝试打开文件之前不检查文件名是否不是空字符串。

Image.open('') 

将导致 imgfile 为无。所以它没有属性,你得到属性错误。

您在解析网页或处理引发错误的文件名时可能存在一些错误。不正确处理错误是非常糟糕的形式,在这种情况下,它会导致您的程序根本无法运行。您有 try/except 语句,但即使有错误,您也只需继续。如果有错误(或为空),您需要做的是更改 except 子句以跳过该文件名。希望对您有所帮助。

编辑:

尝试随时打印变量(例如文件名),以确保它们正确且图像存在。这也可能是文件类型的问题。例如,也许您的脚本正在查找一些非 jpg 图像文件,并试图在 bmp 或您拥有的文件上打开 exif 数据。

【讨论】:

  • 谢谢...在这一点上,一切都有帮助。 :) 但是,我知道它会在页面上找到图像,因为它确实会下载它们。它似乎通过了下载图像功能。我也去掉了 try/except 方面,它仍然做同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
相关资源
最近更新 更多