Python PIL:如何在验证后重新打开映像?

Python PIL:如何在验证后重新打开映像?,python,image,python-imaging-library,Python,Image,Python Imaging Library,我需要打开一个图像,验证图像,然后重新打开它(见下面引用的PIL文档的最后一句话) im.verify() 尝试确定文件是否已损坏,而不进行实际解码 图像数据。如果这种方法发现任何问题,它会提出适当的建议 例外情况。此方法仅适用于新打开的图像;如果 图像已加载,结果未定义。还有,如果你 如果使用此方法后需要加载图像,则必须重新打开 图像文件 这是我代码中的内容,其中picture是django InMemoryUploadedFile对象: img = Image.open(picture) i

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

im.verify()

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

这是我代码中的内容,其中
picture
是django InMemoryUploadedFile对象:

img = Image.open(picture)
img.verify()
img = Image.open(picture)
前两行工作正常,但第三行出现以下错误(我试图“重新打开”图像):

IOError:无法识别图像文件


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

尝试在
验证
和第二个
打开

之间执行
删除img
尝试在
验证
和第二个
打开

之间执行
删除img
这与执行相同

f = open('x.png')
Image.open(f)
Image.open(f)

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

f = open('x.png')
Image.open(f)
Image.open(f)

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

django是如何考虑的?什么是
picture
?@Eevee感谢您的关注,我已经删除了django标签
picture
是一个InMemoryUploadedFile,它是一个图像文件。django是如何考虑这一点的?什么是
picture
?@Eevee感谢您的关注,我已经删除了django标签<代码>图片
是一个InMemoryUploadedFile,它是一个图像文件。太棒了,我不知道!您能提供一个简单的例子,说明如何打开、验证、关闭/查找,然后重新打开吗?@sgarza62我不确定我是否理解,但您必须做到这一点<代码>f=打开('x.png');img=图像打开(f);img.verify();f、 寻求(0);img=Image.open(f)
。您可以执行
f.close(),而不是
f.seek(0)
;f=打开('x.png')
。我想我错过了一些东西,因为这太琐碎了。我就是这么想的。我试过了,但是我得到了一个错误,
强制使用Unicode:need string或buffer,在MemoryUploadedFile的第一行(
f=open(original)
)…我想确保我没有遗漏任何东西。这只是您拥有的另一种文件对象。快速搜索与之相关的任何内容,我在一次搜索中得到了这个图表,它表明这个对象有一个
seek
方法。如果还不清楚,你可能想考虑阅读一些Django(可能还有Python)教程。你不需要第一行,即<代码> f=打开('x.png),因为你已经收到了一个打开的文件对象。在本例中,您命名为
picture
,命名为
f
。如果对象
f
事先可用,那么示例不需要第一行,这就是您的情况。太棒了,我不知道!您能提供一个简单的例子,说明如何打开、验证、关闭/查找,然后重新打开吗?@sgarza62我不确定我是否理解,但您必须做到这一点<代码>f=打开('x.png');img=图像打开(f);img.verify();f、 寻求(0);img=Image.open(f)
。您可以执行
f.close(),而不是
f.seek(0)
;f=打开('x.png')
。我想我错过了一些东西,因为这太琐碎了。我就是这么想的。我试过了,但是我得到了一个错误,
强制使用Unicode:need string或buffer,在MemoryUploadedFile的第一行(
f=open(original)
)…我想确保我没有遗漏任何东西。这只是您拥有的另一种文件对象。快速搜索与之相关的任何内容,我在一次搜索中得到了这个图表,它表明这个对象有一个
seek
方法。如果还不清楚,你可能想考虑阅读一些Django(可能还有Python)教程。你不需要第一行,即<代码> f=打开('x.png),因为你已经收到了一个打开的文件对象。在本例中,您命名为
picture
,命名为
f
。如果对象
f
事先可用,则示例不需要第一行,这是您的情况。