Python PIL图像验证返回无

时间:2018-01-09 20:57:33

标签: python python-imaging-library pillow

我正在开发一个从API检索JPG并处理它的工具。图像的来源不可信,我想测试图像是否是有效的JPG(这是唯一允许的图像类型)。

我遇到了PIL错误,我无法修复。以下是我的代码:

image = StringIO(base64.b64decode(download['file']))
img = Image.open(image)
if img.verify():
    print 'Valid image'
else:
    print 'Invalid image'

然而,似乎img.verify()返回None。我可以在打开的图像上调用其他函数,如img.size(),它返回大小。当我尝试调试代码时,我得到以下输出:

img = Image.open(image)
print img
print img.size()
print img.verify()

[2018-01-09 20:56:43,715: WARNING/Worker-1] <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=2577x1715 at 0x7F16E17DC9D0>
[2018-01-09 20:56:43,716: WARNING/Worker-1] (2577, 1715)
[2018-01-09 20:56:43,716: WARNING/Worker-1] None

有人遇到过同样的问题吗?

2 个答案:

答案 0 :(得分:6)

根据文档,Image#verify(或PIL docs for verify)会在图像出现问题时引发异常,否则无效。

要使用#verify,您可能需要以下内容:

image = StringIO(base64.b64decode(download['file']))
img = Image.open(image)
try:
    img.verify()
    print('Valid image')
except Exception:
    print('Invalid image')

此外,您可能还想通过查看image format来检查图像是否真的是JPG:

if img.format == 'JPEG':
     print('JPEG image')
else:
     print('Invalid image type')

答案 1 :(得分:3)

除了verify并检查.format字段外,如果您通过网络从不值得信赖的(可能是真正的恶意)来源加载图片,您应该担心zip bombs

Pillow(但不是,我认为原始PIL)有一个DecompressionBombWarning,当图像试图超过Image.MAX_IMAGE_PIXELS时会触发(在尝试加载图像之前,您可以自己设置的值) )。在我的安装中,它的默认值是一个非常慷慨的85 Mpixels。

关于此枕头功能的更全面的讨论是this discussion