PIL:验证后如何重新打开图像?

时间:2013-01-15 03:57:36

标签: python image python-imaging-library

我需要打开图像,验证图像,然后重新打开它(参见PIL文档中以下引用的最后一句)

  

im.verify()

     

尝试确定文件是否已损坏,而不实际解码   图像数据。如果这种方法发现任何问题,它会提出合适的   例外。此方法仅适用于新打开的图像;如果   图像已加载,结果未定义。另外,如果你   需要在使用此方法后加载图像,必须重新打开   图像文件。

这就是我在我的代码中所拥有的,其中picture是一个django InMemoryUploadedFile对象:

img = Image.open(picture)
img.verify()
img = Image.open(picture)

前两行工作正常,但我在第三行(我试图“重新打开”图像)时出现以下错误:

IOError: cannot identify image file

正如文档建议的那样,重新打开图像文件的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

这与做

没什么不同
f = open('x.png')
Image.open(f)
Image.open(f)

上面的代码不起作用,因为PIL在读取其前几个字节时会在文件中前进(尝试)识别其格式。在这种情况下尝试使用第二个Image.open将失败,因为现在文件中的当前位置已超过其图像的标题。要确认这一点,您可以验证f.tell()返回的内容。要解决此问题,您必须通过在f.seek(0)的两次调用之间执行Image.open或关闭并重新打开文件来返回文件的开头。

答案 1 :(得分:1)

尝试在del img和第二verify之间执行open