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)参数说明
返回值:返回一个Image对象。
三、Image.save()参数详解
基本语法
代码示例
# 保存图像
img.save(fp, format=None, **params)参数说明
返回值:无返回值(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()可以强制立即加载图像像素数据,在需要测量打开和加载时间或提前发现文件损坏时非常有用。
七、打开方式对比
八、小结与练习
通过本文的学习,我们掌握了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()或进行图像处理操作)时,才会真正读取完整的图像数据。这种机制可以提高打开速度并节省内存。
本文涉及AI创作
内容由AI创作,请仔细甄别