栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

获取图像大小而无需将图像加载到内存中

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

获取图像大小而无需将图像加载到内存中

正如注释所暗示的那样,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
图像的尺寸。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660149.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号