正如注释所暗示的那样,PIL在调用时不会将图像加载到内存中
.open。查看的文档
PIL 1.1.7,文档字符串
.open说:
def open(fp, mode="r"): "Open an image file, without loading the raster data"
源代码中有一些文件操作,例如:
... prefix = fp.read(16) ... fp.seek(0) ...
但是这些几乎不构成读取整个文件。实际上,
.open仅在成功时返回文件对象和文件名。另外文档说:
打开(文件,模式=“ r”)
打开并标识给定的图像文件。
这是一个懒惰的操作;此功能可识别文件,但在尝试处理数据(或调用 load 方法)之前,不会从文件中读取实际图像数据。
深入研究,我们看到
.open调用
_open是特定于图像格式的重载。每个实现
_open都可以在新文件中找到,例如。.jpeg文件位于中
JpegImagePlugin.py。让我们深入研究一下。
这里的事情似乎有些棘手,其中有一个无限循环,当找到jpeg标记时,该循环就会中断:
while True: s = s + self.fp.read(1) i = i16(s) if i in MARKER: name, description, handler = MARKER[i] # print hex(i), name, description if handler is not None: handler(self, i) if i == 0xFFDA: # start of scan rawmode = self.mode if self.mode == "CMYK": rawmode = "CMYK;I" # assume adobe conventions self.tile = [("jpeg", (0,0) + self.size, 0, (rawmode, ""))] # self.__offset = self.fp.tell() break s = self.fp.read(1) elif i == 0 or i == 65535: # padded marker or junk; move on s = "xff" else: raise SyntaxError("no marker found")看起来如果文件格式错误,它 可以 读取整个文件。但是,如果读取信息标记“
OK”,则应尽早爆发。该功能
handler最终设置
self.size图像的尺寸。



