在实际工作中,经常需要对大量图像执行重复性的操作,例如批量调整大小、添加水印、转换格式等。使用 Pillow 进行图像批处理和自动化操作,可以极大地提升效率,减少手动操作。
1.1 批量图像读取与保存
在批量处理时,首先需要读取文件夹中的所有图像文件并加载到内存中,然后对其进行保存。
1.1.1 批量读取文件
Python 的 os
模块和 glob
模块可以帮助我们遍历文件夹中的图像文件。
import os
from PIL import Image
# 设置图像文件夹路径
folder_path = "./images"
# 遍历文件夹中的所有图像文件
for filename in os.listdir(folder_path):
if filename.endswith((".jpg", ".png")):
image_path = os.path.join(folder_path, filename)
image = Image.open(image_path)
image.show()
1.1.2 批量保存图像
在处理完图像后,可以通过 save()
方法将图像保存到指定路径。
output_folder = "./output_images"
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(folder_path):
if filename.endswith((".jpg", ".png")):
image_path = os.path.join(folder_path, filename)
image = Image.open(image_path)
# 处理后的图像保存
output_path = os.path.join(output_folder, filename)
image.save(output_path)
案例:将文件夹中所有图片转换为 PNG
格式并另存为新的文件夹。
1.2 批量调整图像大小
批量调整图像大小常用于生成缩略图或对图像进行压缩,便于上传和存储。
# 批量调整大小
for filename in os.listdir(folder_path):
if filename.endswith((".jpg", ".png")):
image_path = os.path.join(folder_path, filename)
image = Image.open(image_path)
# 调整图像大小
resized_image = image.resize((800, 600)) # 指定新的尺寸
resized_image.save(os.path.join(output_folder, filename))
案例:将图像批量调整为指定尺寸,用于网站的缩略图展示。
1.3 批量添加水印
在批量处理中,常见的需求是为所有图像添加水印。可以创建一个水印图像,将其叠加到每一张图片上。
watermark = Image.open("watermark.png").convert("RGBA")
for filename in os.listdir(folder_path):
if filename.endswith((".jpg", ".png")):
image_path = os.path.join(folder_path, filename)
image = Image.open(image_path).convert("RGBA")
# 调整水印大小
wm_resized = watermark.resize((image.width // 5, image.height // 5))
# 将水印叠加到图像右下角
image.paste(wm_resized, (image.width - wm_resized.width, image.height - wm_resized.height), wm_resized)
image.save(os.path.join(output_folder, filename))
案例:对文件夹内所有图片添加右下角水印,适用于图片版权保护。
1.4 批量格式转换
将图像格式转换为其他常用格式(如 JPEG
、PNG
、GIF
)是图像批处理的重要操作之一。
# 将所有图像批量转换为JPEG格式
for filename in os.listdir(folder_path):
if filename.endswith(".png"):
image_path = os.path.join(folder_path, filename)
image = Image.open(image_path)
# 转换并保存为JPEG格式
new_filename = os.path.splitext(filename)[0] + ".jpg"
image = image.convert("RGB")
image.save(os.path.join(output_folder, new_filename), "JPEG")
案例:将文件夹中所有 PNG 图像批量转换为 JPEG 格式,以便在不支持透明度的场景下使用。
1.5 批量调整图像质量
批量降低图像的质量可以有效减小文件大小,适用于需要上传到网络的场景。
# 将图像质量设置为80%,并批量保存
for filename in os.listdir(folder_path):
if filename.endswith((".jpg", ".jpeg")):
image_path = os.path.join(folder_path, filename)
image = Image.open(image_path)
# 设置压缩质量
image.save(os.path.join(output_folder, filename), quality=80)
案例:批量压缩图像质量,用于减少文件体积。
1.6 批量图像旋转和翻转
批量旋转和翻转图像在处理拍摄角度不一致的图片时非常有用。例如,可以将所有图像旋转 90 度或水平翻转。
# 批量旋转图像
for filename in os.listdir(folder_path):
if filename.endswith((".jpg", ".png")):
image_path = os.path.join(folder_path, filename)
image = Image.open(image_path)
# 旋转90度
rotated_image = image.rotate(90, expand=True)
rotated_image.save(os.path.join(output_folder, filename))
案例:将图片批量旋转,用于标准化拍摄角度。
1.7 批量图像颜色调整
批量调整图像的亮度、对比度或颜色平衡,用于使所有图像呈现一致的风格。
from PIL import ImageEnhance
# 批量调整图像亮度
for filename in os.listdir(folder_path):
if filename.endswith((".jpg", ".png")):
image_path = os.path.join(folder_path, filename)
image = Image.open(image_path)
# 调整亮度
enhancer = ImageEnhance.Brightness(image)
enhanced_image = enhancer.enhance(1.5) # 增强亮度
enhanced_image.save(os.path.join(output_folder, filename))
案例:对一组图片进行亮度或对比度增强,适用于统一视觉效果的场景。
1.8 自动化批处理脚本
可以将上述批处理操作封装到一个脚本中,以实现一键式批量处理。
import os
from PIL import Image, ImageEnhance
def batch_process_images(input_folder, output_folder, resize=None, watermark_path=None, format_conversion=None, quality=None):
os.makedirs(output_folder, exist_ok=True)
# 加载水印图像
watermark = None
if watermark_path:
watermark = Image.open(watermark_path).convert("RGBA")
# 批量处理图像
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".png")):
image_path = os.path.join(input_folder, filename)
image = Image.open(image_path)
# 调整大小
if resize:
image = image.resize(resize)
# 添加水印
if watermark:
wm_resized = watermark.resize((image.width // 5, image.height // 5))
image.paste(wm_resized, (image.width - wm_resized.width, image.height - wm_resized.height), wm_resized)
# 格式转换
output_filename = filename
if format_conversion:
output_filename = os.path.splitext(filename)[0] + f".{format_conversion.lower()}"
image = image.convert("RGB") if format_conversion.lower() == "jpeg" else image
# 调整质量并保存
save_params = {"quality": quality} if quality else {}
image.save(os.path.join(output_folder, output_filename), **save_params)
# 使用脚本进行批处理
batch_process_images(input_folder="./images", output_folder="./output_images", resize=(800, 600), watermark_path="watermark.png", format_conversion="JPEG", quality=80)