1. Python图像处理入门:为什么选择Pillow?
在数字时代,图像处理已成为程序员必备技能之一。作为Python生态中最流行的图像处理库,Pillow(PIL Fork)凭借其简洁的API和强大的功能,成为处理计算机图形学的首选工具。我最初接触Pillow是在一个需要批量处理电商图片的项目中,当时需要在几百张产品图上统一添加水印并调整尺寸,手动操作显然不现实。
Pillow的前身是PIL(Python Imaging Library),但由于其最后更新停留在2009年,社区fork出了兼容Python3的Pillow。如今Pillow已经发展到9.x版本,支持绝大多数常见的图像处理需求。与OpenCV等专业库相比,Pillow的学习曲线更为平缓,特别适合Python开发者快速实现图像处理功能。
提示:虽然常听到"PIL/Pillow"的称呼,但实际使用时应该始终安装pillow包(
pip install pillow),导入时使用from PIL import Image这种特殊写法是为了保持对旧PIL代码的兼容性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建与基础操作
2.1 安装与验证
安装Pillow非常简单,但需要注意一些版本兼容问题:
bash复制# 推荐使用虚拟环境
python -m venv img_env
source img_env/bin/activate # Linux/Mac
img_env\Scripts\activate # Windows
pip install pillow
验证安装是否成功:
python复制from PIL import Image
print(Image.__version__) # 应该输出类似"9.1.0"的版本号
常见安装问题:
- 如果遇到"ZLIB (PNG/ZIP) support not available"错误,需要安装系统依赖:
- Ubuntu:
sudo apt-get install libz-dev libjpeg-dev - Mac:
brew install libjpeg zlib - Windows: 通常已内置
- Ubuntu:
2.2 第一个图像处理程序
让我们从一个简单的例子开始 - 打开图片并显示基本信息:
python复制from PIL import Image
def image_info(img_path):
with Image.open(img_path) as img:
print(f"格式: {img.format}")
print(f"尺寸: {img.size}") # (宽度, 高度)
print(f"模式: {img.mode}") # RGB, CMYK, L(灰度)等
# 显示前3个像素的RGB值
pixels = list(img.getdata())
print("前3个像素:", pixels[:3])
image_info("sample.jpg")
这个简单程序揭示了几个关键概念:
Image.open()是核心入口,支持JPEG、PNG、GIF等30+格式- 图像数据采用惰性加载,实际像素数据在首次访问时才会读取
- 像素数据通过
getdata()获取,返回的是包含所有像素的扁平列表
3. 核心图像处理技术详解
3.1 图像变换操作
3.1.1 尺寸调整与旋转
调整尺寸是最常见的需求之一,Pillow提供了多种算法:
python复制from PIL import Image
def resize_image(input_path, output_path, size):
with Image.open(input_path) as img:
# 高质量缩放下采样
resized = img.resize(size, Image.Resampling.LANCZOS)
resized.save(output_path)
# 保持宽高比的缩略图
img.thumbnail((200, 200)) # 原地修改
img.save("thumbnail.jpg")
# 旋转45度并填充背景
def rotate_image(input_path, degrees=45, expand=True):
with Image.open(input_path) as img:
rotated = img.rotate(degrees, expand=expand, fillcolor="white")
rotated.save("rotated.jpg")
关键参数说明:
resize()的第二个参数指定重采样算法:NEAREST: 最快但质量差BILINEAR: 平衡速度与质量LANCZOS: 最高质量(推荐)
rotate()的expand参数决定是否调整画布大小以适应旋转后的图像
3.1.2 裁剪与拼接
精确裁剪是电商图片处理的常见需求:
python复制def crop_image(input_path, box):
""" box: (left, upper, right, lower) """
with Image.open(input_path) as img:
cropped = img.crop(box)
cropped.save("cropped.jpg")
# 拼接两张图片(水平)
def concat_images(img1_path, img2_path):
with Image.open(img1_path) as img1, Image.open(img2_path) as img2:
# 确保高度相同
height = min(img1.height, img2.height)
img1 = img1.resize((int(img1.width * height/img1.height), height))
img2 = img2.resize((int(img2.width * height/img2.height), height))
new_img = Image.new('RGB', (img1.width + img2.width, height))
new_img.paste(img1, (0, 0))
new_img.paste(img2, (img1.width, 0))
new_img.save("concat.j
