本章将详细介绍 Pillow 中常见的图像基础操作,包括图像的打开、保存、裁剪、缩放、格式转换等基本功能。
1.1 打开与保存图像
Pillow 提供了方便的 Image.open()
和 Image.save()
方法来打开和保存图像文件。无论是进行格式转换还是修改图像内容,这些基本操作都是所有图像处理的起点。
打开图像
使用 Image.open()
方法可以打开本地文件系统中的图像文件,并返回一个 Image
对象。
from PIL import Image# 打开图像文件
image = Image.open("example.jpg")# 显示图像
image.show()
保存图像
使用 Image.save()
可以将处理后的图像保存到指定路径。可以在保存时指定不同的图像格式,如 JPEG、PNG 等。
# 保存图像为 PNG 格式
image.save("output_image.png")# 保存图像并调整压缩质量
image.save("output_image.jpg", quality=85)
案例:将一张图像读取后另存为不同格式,并调整图像质量
image = Image.open("example.jpg")# 将图像另存为 PNG 格式
image.save("example_converted.png")# 将图像保存为 JPEG 格式并降低质量
image.save("example_low_quality.jpg", quality=50)
1.2 获取图像信息(格式、大小、模式等)
在处理图像时,了解图像的基础信息如格式、尺寸和色彩模式是非常重要的。Pillow 提供了图像对象的属性来获取这些信息。
图像格式、大小和模式
format
: 获取图像的格式,如 JPEG、PNG 等。size
: 返回一个包含宽度和高度的元组 (width, height)。mode
: 获取图像的色彩模式,如 RGB、RGBA、L 等。
# 获取图像信息
print("Format:", image.format) # 图像格式
print("Size:", image.size) # 图像尺寸
print("Mode:", image.mode) # 色彩模式
案例:读取图像信息并判断图像格式
# 打开图像
image = Image.open("example.jpg")# 获取并打印图像信息
format = image.format
width, height = image.size
mode = image.modeprint(f"图像格式: {format}")
print(f"图像尺寸: {width}x{height}")
print(f"色彩模式: {mode}")# 判断是否为 JPEG 格式
if format == "JPEG":print("该图像为 JPEG 格式。")
1.3 图像格式转换
在图像处理中,常常需要将图像从一种格式转换为另一种。Pillow 可以在图像保存时通过指定文件扩展名实现格式转换,或者在 save
方法中直接指定 format
参数。
直接保存为目标格式
# 打开图像
image = Image.open("example.jpg")# 将图像转换并保存为 PNG 格式
image.save("converted_image.png")
案例:批量转换文件夹内的所有 JPEG 图像为 PNG 格式
import os
from PIL import Image# 设置输入与输出文件夹
input_folder = "images/"
output_folder = "converted_images/"# 检查输出文件夹是否存在,不存在则创建
if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍历文件夹内的所有文件
for filename in os.listdir(input_folder):if filename.endswith(".jpg"):# 打开 JPEG 图像image = Image.open(os.path.join(input_folder, filename))# 构造 PNG 输出文件名output_filename = os.path.splitext(filename)[0] + ".png"# 保存为 PNG 格式image.save(os.path.join(output_folder, output_filename))print(f"已将 {filename} 转换为 {output_filename}")
1.4 图像裁剪与缩放
图像裁剪和缩放是两种常见的图像处理操作。Pillow 提供了直观的裁剪和缩放方法,能够轻松实现对图像的局部裁剪和尺寸调整。
图像裁剪
裁剪通过 crop()
方法实现,需要提供一个定义裁剪区域的四元组 (left, upper, right, lower)
,即裁剪区域的左上角和右下角坐标。
# 定义裁剪区域 (左, 上, 右, 下)
crop_area = (50, 50, 200, 200)# 裁剪图像
cropped_image = image.crop(crop_area)
cropped_image.show()
图像缩放
使用 resize()
方法可以调整图像尺寸。resize()
接收一个新的尺寸元组 (new_width, new_height)
。
# 调整图像尺寸至 100x100
resized_image = image.resize((100, 100))
resized_image.show()
案例:读取图像并按比例缩放至宽度为 200 像素
# 获取原始图像尺寸
width, height = image.size# 计算缩放比例,保持宽高比
new_width = 200
new_height = int((new_width / width) * height)# 缩放图像
resized_image = image.resize((new_width, new_height))
resized_image.show()
1.5 调整图像尺寸与比例
除了 resize()
方法,Pillow 还提供了 thumbnail()
方法,可保持原始比例自动缩放图像至指定尺寸之内。该方法的特点是不会放大图像尺寸。
使用 thumbnail()
保持比例缩放
# 最大尺寸
max_size = (200, 200)# 缩略图生成
image.thumbnail(max_size)
image.show()
案例:批量生成文件夹内所有图像的缩略图
input_folder = "images/"
output_folder = "thumbnails/"
max_size = (200, 200)# 检查输出文件夹是否存在,不存在则创建
if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍历并生成缩略图
for filename in os.listdir(input_folder):if filename.endswith(".jpg") or filename.endswith(".png"):image = Image.open(os.path.join(input_folder, filename))# 生成缩略图image.thumbnail(max_size)# 保存缩略图thumbnail_filename = f"thumb_{filename}"image.save(os.path.join(output_folder, thumbnail_filename))print(f"已生成 {thumbnail_filename} 的缩略图")
在本章中,我们详细介绍了图像的基础操作,包括图像的打开、保存、信息提取、格式转换、裁剪与缩放等。