从Python获取图像文件的形状而不加载图像
有没有一种有效的方法可以在不实际加载图片到Python中的情况下,知道一个图片文件的大小(高度、宽度和通道数)呢?
最简单的方法是:
img = cv2.imread('a.jpg')
print img.shape
但是这样做会浪费CPU和内存,因为我并不需要实际的图片内容。
1 个回答
15
PIL的Image.open
方法在真正需要用到图片数据之前并不会加载这些数据,具体可以参考文档。
这个过程叫做“懒加载”;这个函数只是识别了文件,但文件仍然是打开的,直到你尝试处理数据(或者调用
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。