我需要打开图像,验证图像,然后重新打开它(参见PIL文档中以下引用的最后一句)
im.verify()
尝试确定文件是否已损坏,而不实际解码 图像数据。如果这种方法发现任何问题,它会提出合适的 例外。此方法仅适用于新打开的图像;如果 图像已加载,结果未定义。另外,如果你 需要在使用此方法后加载图像,必须重新打开 图像文件。
这就是我在我的代码中所拥有的,其中picture
是一个django InMemoryUploadedFile对象:
img = Image.open(picture)
img.verify()
img = Image.open(picture)
前两行工作正常,但我在第三行(我试图“重新打开”图像)时出现以下错误:
IOError: cannot identify image file
正如文档建议的那样,重新打开图像文件的正确方法是什么?
答案 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
。