Python PIL 映像验证返回 None



我正在开发一个工具,可以从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

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

根据文档,如果图像有问题,Image#verify (或用于验证的 PIL 文档(会引发异常,否则什么也不做。

要使用#verify,您可能需要这样的东西:

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

此外,您可能还希望通过查看图像格式来检查图像是否实际上是 JPG:

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

除了verify和检查.format字段之外,如果您在网络上从不可信(可能是真正的恶意(来源加载图像,您应该担心zip炸弹。

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

关于这个枕头功能的更全面的讨论是这个讨论。

最新更新