Python PIL 图片验证 returns None
Python PIL image Verify returns 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()returnsNone。我可以在打开的图像上调用其他函数,例如 img.size() 的 returns 大小。当我尝试调试代码时得到以下输出:
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 (or the 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')
除了 verify
和检查 .format
字段之外,如果您从网络上的不可信(并且可能是真正恶意的)来源加载图像,您应该担心 zip bombs.
Pillow(但我认为不是原始 PIL)有一个 DecompressionBombWarning
,当图像试图超过 Image.MAX_IMAGE_PIXELS
(您可以在尝试加载之前自行设置的值)时触发一个图像)。在我的安装中,它的默认值是非常慷慨的 85 Mpixels。
有关此 Pillow 功能的更全面讨论位于 this discussion。
我正在开发一种工具,可以从 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()returnsNone。我可以在打开的图像上调用其他函数,例如 img.size() 的 returns 大小。当我尝试调试代码时得到以下输出:
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 (or the 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:
来检查图片是否真的是 JPGif img.format == 'JPEG':
print('JPEG image')
else:
print('Invalid image type')
除了 verify
和检查 .format
字段之外,如果您从网络上的不可信(并且可能是真正恶意的)来源加载图像,您应该担心 zip bombs.
Pillow(但我认为不是原始 PIL)有一个 DecompressionBombWarning
,当图像试图超过 Image.MAX_IMAGE_PIXELS
(您可以在尝试加载之前自行设置的值)时触发一个图像)。在我的安装中,它的默认值是非常慷慨的 85 Mpixels。
有关此 Pillow 功能的更全面讨论位于 this discussion。