Python 图像处理终极指南:JPEG 图片的读取、编辑、优化与保存(附代码)
** 本文为Python开发者量身打造,全面深入讲解如何使用Python高效处理JPEG图像,从基础的PIL/Pillow库操作,到高级的图像编辑、质量优化、元数据管理,再到性能提升技巧,一文带你掌握Python图像处理的核心技能,轻松应对各种JPEG图片处理需求。

引言:为什么选择Python处理JPEG图像?
在数字时代,图像无处不在,JPEG(Joint Photographic Experts Group)作为一种最常见的图像格式,以其高效的压缩率和良好的视觉质量,广泛应用于网页、社交媒体、数字摄影等领域,作为功能强大的编程语言,Python凭借其简洁的语法和丰富的第三方库,成为了图像处理领域的首选工具之一。
无论是批量调整图片大小、压缩图片以节省存储空间,还是对图片进行裁剪、滤镜等艺术化处理,Python都能轻松胜任,本文将围绕“python image jpeg”这一核心,带你从入门到精通,掌握Python处理JPEG图像的方方面面。
准备工作:安装核心库 Pillow
Python本身不直接支持图像处理,我们需要借助第三方库。Pillow是Python Imaging Library(PIL)的一个活跃分支,是目前Python社区最主流、最易用的图像处理库。
安装 Pillow

打开你的终端或命令行工具,执行以下命令即可完成安装:
pip install Pillow
安装完成后,我们就可以在Python代码中导入并使用它了,为了方便,我们通常将其导入为PIL:
from PIL import Image import os
基础操作:打开、显示与保存JPEG图像
万事开头难,让我们从最基础的“打开-查看-保存”流程开始。
打开一张JPEG图片

使用Image.open()函数,你可以轻松打开一张图片,它会返回一个Image对象,包含了图片的所有信息。
# 打开一张名为 'example.jpg' 的图片
try:
img = Image.open('example.jpg')
print(f"图片格式: {img.format}")
print(f"图片尺寸: {img.size} (宽, 高)")
print(f"图片模式: {img.mode}") # 'RGB', 'L' (灰度), 'RGBA' (带透明通道)
except FileNotFoundError:
print("错误:未找到指定文件!")
显示图片(可选)
如果你在本地开发环境中,可以使用show()方法快速弹出一个窗口显示图片。注意: 此方法依赖于系统自带的图片查看器,在某些服务器或无头环境中可能无法使用。
# img.show() # 这会调用系统默认图片查看器
保存图片
处理完图片后,使用save()方法将其保存。Pillow会根据你提供的文件名后缀自动选择保存格式。
# 将图片另存为 'new_example.jpg'
img.save('new_example.jpg')
print("图片已保存为 new_example.jpg")
核心技巧:JPEG图像的编辑与处理
掌握了基础操作后,我们来看看如何对JPEG图片进行实质性的编辑。
调整图片尺寸
调整尺寸是图像处理中最常见的操作之一,例如为网站生成缩略图。
# 打开原始图片
img = Image.open('example.jpg')
# 获取原始尺寸
width, height = img.size
# 计算新的尺寸(将宽度缩小到50%)
new_width = int(width * 0.5)
new_height = int(height * 0.5)
# 使用 resize() 方法调整尺寸
resized_img = img.resize((new_width, new_height))
# 保存调整后的图片
resized_img.save('resized_example.jpg')
print(f"图片已缩放并保存为 resized_example.jpg,新尺寸: {resized_img.size}")
裁剪图片
crop()方法需要一个四元组 (left, upper, right, lower) 作为参数,定义了裁剪区域的坐标。
# 打开原始图片
img = Image.open('example.jpg')
# 定义裁剪区域 (left, upper, right, lower)
# 假设我们要裁剪中心一个 300x300 的正方形
width, height = img.size
left = (width - 300) / 2
upper = (height - 300) / 2
right = (width + 300) / 2
lower = (height + 300) / 2
# 执行裁剪
cropped_img = img.crop((left, upper, right, lower))
# 保存裁剪后的图片
cropped_img.save('cropped_example.jpg')
print("图片已裁剪并保存为 cropped_example.jpg")
旋转与翻转
# 打开原始图片
img = Image.open('example.jpg')
# 旋转45度(逆时针)
rotated_img = img.rotate(45)
# 水平翻转
flipped_horizontal_img = img.transpose(Image.FLIP_LEFT_RIGHT)
# 垂直翻转
flipped_vertical_img = img.transpose(Image.FLIP_TOP_BOTTOM)
# 保存
rotated_img.save('rotated_example.jpg')
flipped_horizontal_img.save('flipped_h_example.jpg')
优化之道:控制JPEG图片质量与大小
对于JPEG格式而言,压缩质量是一个至关重要的参数,它直接决定了文件大小和图像质量之间的平衡。
保存时指定质量参数
save()方法接受一个quality参数(范围从1到100,默认为75),数值越高,质量越好,但文件越大。
# 打开原始图片
img = Image.open('example.jpg')
# 以高质量 (95) 保存
img.save('high_quality_example.jpg', quality=95)
# 以低质量 (30) 保存,文件会显著变小
img.save('low_quality_example.jpg', quality=30)
print("已生成高质量和低质量版本的图片。")
批量压缩图片
这是一个非常实用的场景,例如需要优化一批上传到服务器的图片。
def compress_images(input_folder, output_folder, quality=85):
"""
批量压缩文件夹中的所有JPEG图片。
"""
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.jpg', '.jpeg')):
img_path = os.path.join(input_folder, filename)
img = Image.open(img_path)
# 构造输出路径
output_path = os.path.join(output_folder, filename)
# 保存压缩后的图片
img.save(output_path, quality=quality, optimize=True)
print(f"已压缩: {filename} -> 质量: {quality}")
# 使用示例
# compress_images('original_images', 'compressed_images', quality=70)
高级探索:处理EXIF元数据
JPEG图片通常包含EXIF元数据,这些数据记录了拍摄时的相机型号、光圈、快门速度、GPS位置等信息。Pillow也可以读取这些数据。
注意: 需要安装Pillow的EXIF扩展:pip install pillow-heif 或使用piexif库,这里我们使用piexif作为示例。
pip install piexif
from PIL import Image
import piexif
# 打开带有EXIF信息的图片
img = Image.open('photo_with_exif.jpg')
# 读取EXIF数据
exif_dict = piexif.load(img.info.get('exif'))
# 打印部分EXIF信息
if '0th' in exif_dict:
camera_make = exif_dict['0th'].get(piexif.ImageIFD.Make)
camera_model = exif_dict['0th'].get(piexif.ImageIFD.Model)
print(f"相机品牌: {camera_make}")
print(f"相机型号: {camera_model}")
# 修改EXIF信息并保存
# 添加一个注释
if 'Exif' in exif_dict:
exif_dict['Exif'][piexif.ExifIFD.UserComment] = b"Processed with Python"
else:
exif_dict['Exif'] = {piexif.ExifIFD.UserComment: b"Processed with Python"}
# 将修改后的字典转换回字节流
exif_bytes = piexif.dump(exif_dict)
# 保存图片,并传入新的EXIF数据
img.save('photo_with_modified_exif.jpg', exif=exif_bytes)
print("EXIF信息已修改并保存。")
性能提升:处理大量图片的技巧
当需要处理成百上千张图片时,效率至关重要。
使用生成器(Generator)
如果图片文件很大,一次性加载所有图片到内存中会导致内存溢出,使用生成器可以逐个处理图片,节省内存。
def image_files_generator(folder_path):
"""一个生成器,逐个 yield 图片文件路径"""
for filename in os.listdir(folder_path):
if filename.lower().endswith(('.jpg', '.jpeg')):
yield os.path.join(folder_path, filename)
# 使用生成器处理
for img_path in image_files_generator('my_photos'):
img = Image.open(img_path)
# ... 执行处理操作 ...
img.save(f'processed/{os.path.basename(img_path)}')
img.close() # 显式关闭图片,释放内存
多进程/多线程处理
对于CPU密集型的图像处理任务(如应用复杂滤镜),可以利用multiprocessing库实现并行处理,充分利用多核CPU。
from multiprocessing import Pool
def process_single_image(args):
"""处理单个图片的函数"""
input_path, output_path = args
try:
img = Image.open(input_path)
# 这里放置你的处理逻辑,例如转为灰度图
img = img.convert('L')
img.save(output_path)
img.close()
print(f"完成处理: {input_path}")
except Exception as e:
print(f"处理 {input_path} 时出错: {e}")
def batch_process_with_multiprocessing(input_folder, output_folder, num_processes=4):
"""使用多进程批量处理"""
if not os.path.exists(output_folder):
os.makedirs(output_folder)
tasks = []
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.jpg', '.jpeg')):
input_path = os.path.join(input_folder, filename)
output_path = os.path.join(output_folder, filename)
tasks.append((input_path, output_path))
with Pool(processes=num_processes) as pool:
pool.map(process_single_image, tasks)
# 使用示例
# batch_process_with_multiprocessing('original_images', 'processed_images_mp', num_processes=4)
总结与展望
本文系统地介绍了使用Python处理JPEG图像的核心知识,从环境搭建、基础操作,到编辑、优化、元数据处理,再到性能提升技巧。Pillow库功能强大,远不止于此,它还支持图像滤镜、颜色空间转换、直方图处理等多种高级功能。
作为一名开发者,掌握Python图像处理能力,不仅能极大地提升工作效率,还能为你的项目增添更多创意和可能性,希望这篇文章能成为你探索Python图像世界的坚实起点。
下一步,你可以尝试:
- 结合
OpenCV库进行更复杂的计算机视觉任务。 - 探索
scikit-image库,它在科学计算和图像分析方面有更专业的工具。 - 构建一个简单的Web应用(如Flask或Django),实现图片上传和在线处理功能。
#Python #图像处理 #JPEG #Pillow #PIL #编程教程 #代码示例 #图片压缩 #批量处理
