pin_drop当前位置:知识文库 ❯ 图文

Pillow Image.open()与save()教程 - 图像打开保存详解

一、Image打开与保存概述

Image模块的open()save()是Pillow中最基础的两个操作。open()用于从文件或文件对象中加载图像,save()用于将图像保存到文件。

这两个方法是所有图像处理流程的起点和终点,掌握它们是使用Pillow的前提。无论是简单的格式转换还是复杂的图像处理流水线,都离不开这两个核心方法。

二、Image.open()参数详解

基本语法

代码示例

from PIL import Image

# 打开图像
img = Image.open(fp, mode='r', formats=None)

参数说明

参数 类型 必填 说明
fp str/Path/文件对象 文件路径或文件对象
mode str 打开模式,默认为'r'(只读)
formats list/tuple 限制尝试打开的格式列表

返回值:返回一个Image对象。

三、Image.save()参数详解

基本语法

代码示例

# 保存图像
img.save(fp, format=None, **params)

参数说明

参数 类型 必填 说明
fp str/Path/文件对象 保存路径或文件对象
format str 指定保存格式,默认根据文件扩展名推断
quality int JPEG质量,1-95,默认75
optimize bool 是否优化,JPEG/PNG可用
compress_level int PNG压缩级别,0-9,默认6

返回值:无返回值(None)。

四、代码示例演示

示例1:打开图像并查看基本信息

代码示例

from PIL import Image

# 打开图像文件
img = Image.open('example.jpg')

print(f"图像尺寸: {img.size}")
print(f"图像宽度: {img.width}")
print(f"图像高度: {img.height}")
print(f"图像模式: {img.mode}")
print(f"图像格式: {img.format}")
print(f"图像信息: {img.info}")

输出:

代码示例

图像尺寸: (1920, 1080)
图像宽度: 1920
图像高度: 1080
图像模式: RGB
图像格式: JPEG
图像信息: {'dpi': (72, 72), 'exif': b'...'}

示例2:图像格式转换保存

代码示例

from PIL import Image

# 打开PNG图像
img = Image.open('photo.png')
print(f"原始格式: {img.format}, 模式: {img.mode}")

# 保存为JPEG(需要先转换模式)
if img.mode == 'RGBA':
    img = img.convert('RGB')

img.save('photo.jpg', format='JPEG', quality=90)
print("已保存为JPEG格式,质量90")

# 保存为BMP
img.save('photo.bmp', format='BMP')
print("已保存为BMP格式")

# 保存为WebP
img.save('photo.webp', format='WEBP', quality=85)
print("已保存为WebP格式")

输出:

代码示例

原始格式: PNG, 模式: RGBA
已保存为JPEG格式,质量90
已保存为BMP格式
已保存为WebP格式

示例3:使用文件对象打开和保存

代码示例

from PIL import Image
import io

# 从字节流打开图像
with open('input.jpg', 'rb') as f:
    img = Image.open(f)
    print(f"从文件对象打开: {img.size}, {img.mode}")

# 保存到字节流
buffer = io.BytesIO()
img.save(buffer, format='PNG')
png_bytes = buffer.getvalue()
print(f"PNG字节数: {len(png_bytes)}")

# 从字节流重新加载
buffer.seek(0)
img2 = Image.open(buffer)
print(f"从字节流重新加载: {img2.size}, {img2.mode}")

输出:

代码示例

从文件对象打开: (1920, 1080), RGB
PNG字节数: 3456789
从字节流重新加载: (1920, 1080), RGB

五、实际应用场景

  • Web应用:接收用户上传的图片,验证格式后保存到服务器,是Web开发中最常见的图像处理需求。

  • 批量格式转换:将目录下所有图片统一转为指定格式,适用于图片资源管理和网站优化。

  • 网络爬虫:将从URL下载的图片字节流直接用Pillow打开处理,无需先保存到磁盘。

六、注意事项

  • 懒加载机制:Image.open()采用懒加载机制,图像数据在首次访问时才读取,而非打开时。

  • 模式转换:保存为JPEG格式时,RGBA模式需先转换为RGB,否则会报错。

  • 有损压缩:JPEG是有损压缩,多次保存会导致图像质量逐步下降。

  • 文件生命周期:使用文件对象打开图像时,在图像处理完成前不要关闭文件对象。

小贴士

使用img.load()可以强制立即加载图像像素数据,在需要测量打开和加载时间或提前发现文件损坏时非常有用。

七、打开方式对比

方式 代码 特点
文件路径 Image.open('photo.jpg') 最常用,简单直接
文件对象 Image.open(open('photo.jpg','rb')) 可控制文件生命周期
字节流 Image.open(io.BytesIO(bytes)) 适合网络数据、内存数据
Path对象 Image.open(Path('photo.jpg')) 兼容pathlib路径

八、小结与练习

通过本文的学习,我们掌握了Pillow中Image打开与保存的核心方法:

  • 多种打开方式:Image.open()支持从文件路径、文件对象、字节流等多种方式加载图像。

  • 灵活保存:Image.save()根据文件扩展名自动推断格式,也可通过format参数显式指定。

  • 格式兼容:格式转换时需注意颜色模式的兼容性,特别是RGBA转JPEG需先转为RGB。


练习题

练习1:编写程序,打开一张图片,分别保存为JPEG(quality=50和quality=95),对比文件大小差异。

练习2:编写程序,从网络下载一张图片的字节数据(使用requests库),用io.BytesIO包装后用Pillow打开并保存为本地文件。


常见问题

Image.open()打开后img.format为什么有时是None?

当使用Image.new()创建图像时,format属性为None,因为这不是从文件中加载的。只有通过Image.open()从文件打开的图像才会有format属性。如果打开后format仍为None,可能是Pillow无法识别该文件格式。

为什么RGBA图像不能直接保存为JPEG?

JPEG格式不支持透明通道(Alpha通道),而RGBA模式包含透明信息。保存前需要先用img.convert('RGB')将图像转换为RGB模式,丢弃透明信息后才能保存为JPEG格式。

如何控制JPEG保存的文件大小?

通过quality参数控制JPEG质量(1-95),质量越低文件越小。还可以设置optimize=True进行优化压缩。通常quality=85是质量和大小的良好平衡点。

什么是Image.open()的懒加载机制?

Image.open()在调用时只读取文件头信息(如尺寸、模式),并不会立即加载全部像素数据。只有当首次访问像素数据(如调用load()、getpixel()或进行图像处理操作)时,才会真正读取完整的图像数据。这种机制可以提高打开速度并节省内存。

标签: Pillow Image打开 Image保存 格式转换 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Pillow库简介与安装教程 - Python图像处理入门 下一篇: Pillow Image.crop()裁剪教程 - 图像裁剪方法详解

poll相关推荐