使用Python获取图像文件的形状而无需加载图像

7

有没有一种高效的方法可以在不将图像加载到Python中的情况下知道图像文件的大小(高度、宽度、通道)?

一个简单的方法是:

img = cv2.imread('a.jpg')
print img.shape

但这会浪费CPU(和内存),因为我不需要图片本身。


在JPEG的情况下,这并不是微不足道的,因为图像属性不是以纯粹、易于阅读的格式存储的。相反,JPEG数据存储为段的串联。我发现这个答案非常有趣:(https://dev59.com/rWMl5IYBdhLWcg3wmoDS#18264693) - Яois
1个回答

15
PIL的Image.open直到需要时才加载图像数据,如docs中所示。
这是一项延迟操作; 此函数识别文件,但文件保持打开状态,实际图像数据不会从文件中读取,直到您尝试处理数据(或调用load()方法)。参见new()。
要在ipython中检查此功能,我运行了:
im = Image.open(filename)
im.size

在一个22MB的图像上,ps -av 报告如下:
33714 17772  0.8 /usr/bin/python2 /usr/bin/ipython2
34506 18220  0.8 /usr/bin/python2 /usr/bin/ipython2
34506 18220  0.8 /usr/bin/python2 /usr/bin/ipython2

对于内存使用情况,在open之前,在size之前和之后,确认22MB的图像没有被加载到内存中(ipython最初使用32538 17252)。在执行im.load()之后,该数字跳升至约57k。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接