从Python获取图像文件的形状而不加载图像

7 投票
1 回答
9457 浏览
提问于 2025-04-18 07:06

有没有一种有效的方法可以在不实际加载图片到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。

撰写回答