PIL.Image.open() 返回的对象立即提供 size 和 mode 属性,无需 .load();size 是 (width, height) 像素元组,mode 表示色彩空间(如 'RGB'、'RGBA');AttributeError 通常因对象未正确创建或提前关闭导致。
用
读取图片后直接查
和
图片分辨率和色彩格式不是“额外提取”的元数据,而是打开后立刻可得的实例属性。只要不调用
或
等触发解码的操作,
(宽高元组)和
(如
、
、
)在
返回对象上就已就绪。
常见错误是以为要先
才能读尺寸——其实完全没必要,反而可能触发不必要的解码,尤其对大图或 WebP/HEIC 等格式。
是
元组,单位为像素,始终存在
表示色彩空间和通道数:
(1-bit)、
(灰度)、
(三通道)、
(带 Alpha)、
(印刷)等
某些格式(如 JPEG)即使保存时带 ICC 配置文件,
也不会变成
或其他变体,仍是
遇到
怎么办
这说明你没真正拿到
对象,而是误用了未完成加载的句柄,或者对象已被关闭。典型场景是:用
打开文件但没传给
,或在
块外访问
。
正确做法:始终用
,且确保
是有效路径或 file-like 对象
如果从字节流读取(如 requests 响应),必须用
包一层再传给
,不能直接传
不要对
的返回值做
或提前
,否则后续访问
会失败
值和实际像素数据不一定一致
是 PIL 内部解释的色彩模式,不等于原始文件存储格式。比如一张 8-bit 灰度 PNG,
是
;但若用
,
就变成
,哪怕像素值全是 (x,x,x)。更隐蔽的是:某些 JPEG 文件带 Exif Orientation,
返回的是“逻辑尺寸”,而原始 JPEG 数据可能是旋转前的宽高。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
想确认真实编码格式?看文件头或用
命令,PIL 的
不反映容器格式(如 JPEG vs PNG)
处理 WebP 或 AVIF 时,
可能是
或
,但底层压缩方式完全不影响
值
用
查通道名(如
),比只看
更直观
需要 EXIF、DPI、ICC 等扩展信息时别依赖
/
和
是图像数据的基本描述,不包含拍摄时间、设备型号、物理分辨率(DPI)或色彩配置文件。这些属于元数据,需单独提取,且不同格式支持程度差异很大。
JPEG/TIFF 的 EXIF 和 IPTC 信息可通过
(已弃用)或
+
解析,但结构复杂、字段不统一
DPI 存在
中,键名可能是
(元组)或
,且很多编辑器会丢弃它
ICC 配置文件在
,但长度可能达几百 KB,且 PIL 不校验其有效性
别试图从
推断是否含透明通道:用
更可靠
PIL 的
和
看似简单,但容易混淆“解码后视图”和“原始文件语义”。真要靠住,得盯紧对象生命周期、区分容器格式与色彩模式、并意识到元数据永远是另一套体系。
PIL.Image.open()sizemode.load().convert()sizemode'RGB''L''RGBA'Image.open().load()size(width, height)mode'1''L''RGB''RGBA''CMYK'mode'RGBX''RGB'AttributeError: 'JpegImageFile' object has no attribute 'size'Imagewith open(...)PIL.Image.open()with Image.open(...) as img:imgimg = Image.open(path_or_file)path_or_fileio.BytesIO(resp.content)Image.open()resp.contentImage.open()del.close()sizemodemodemode'L'.convert('RGB')mode'RGB'sizefilemodemode'RGB''RGBA'modeimg.getbands()('R', 'G', 'B')modesizemodesizemodeimg._getexif()img.info.get('exif')PIL.ExifTagsimg.info'dpi''jfif_density'img.info.get('icc_profile')mode'A' in img.getbands()sizemode