Python脚本图像处理Pillow常用操作

wen 实用脚本 1

Python脚本图像处理:Pillow库常用操作实战指南

📚 文章目录导读

  1. Pillow库概述与安装 – 为什么选择Pillow?环境搭建与基础概念
  2. 图像文件读写与格式转换 – 打开、保存、批量转换格式
  3. 图像几何变换 – 缩放、旋转、裁剪、翻转
  4. 色彩与通道操作 – 灰度化、颜色分离与合并、调色板
  5. 图像滤镜与增强 – 模糊、锐化、边缘检测、对比度调整
  6. 文本与图形绘制 – 在图片上添加水印、标注、形状
  7. 实战案例:批量加水印脚本 – 完整代码与运行效果
  8. 常见问题与问答 – 解决实际开发中的疑难杂症
  9. SEO优化技巧与总结 – 提升Python图像处理文章排名的建议

Pillow库概述与安装

Pillow是Python生态系统中最受欢迎的图像处理库之一,它是PIL(Python Imaging Library)的活跃分支,提供了强大的图像操作能力,无论是个人博客的图片压缩,还是企业级的验证码生成、水印批量添加,Pillow都能胜任。

Python脚本图像处理Pillow常用操作

安装方式(建议在虚拟环境中进行):

pip install Pillow

安装完成后,通过from PIL import Image导入核心模块,Pillow支持超过30种图像格式,包括JPEG、PNG、GIF、BMP、TIFF等。

核心概念:图像在Pillow中以Image对象呈现,每个对象包含像素矩阵、调色板、元数据等,你可以把它想象成一个二维数组,每个单元格是一个像素点(RGB或RGBA值)。


图像文件读写与格式转换

打开与显示

from PIL import Image
img = Image.open('example.jpg')  # 支持路径、文件对象、BytesIO
img.show()  # 调用系统默认图片查看器

保存与格式转换

img.save('output.png')  # 自动根据扩展名转换格式
img.save('output.jpg', quality=85)  # JPEG可指定压缩质量

批量转换示例:将文件夹内所有PNG转为JPG

import os
from PIL import Image
for fname in os.listdir('./images'):
    if fname.endswith('.png'):
        img = Image.open(f'./images/{fname}')
        new_name = fname.replace('.png', '.jpg')
        img.save(f'./output/{new_name}', 'JPEG')

图像几何变换

缩放

img_resized = img.resize((300, 300))  # 直接指定目标尺寸
img_thumbnail = img.thumbnail((300, 300))  # 等比例缩放(修改原对象)

注意resize会拉伸变形,thumbnail保持宽高比。

旋转

img_rotated = img.rotate(45, expand=True, fillcolor=(255,255,255))
# expand=True自动扩展画布避免裁剪,fillcolor填充空白区域

裁剪

box = (100, 50, 400, 350)  # (左, 上, 右, 下)
img_cropped = img.crop(box)

翻转

img_flip_h = img.transpose(Image.FLIP_LEFT_RIGHT)  # 水平翻转
img_flip_v = img.transpose(Image.FLIP_TOP_BOTTOM)  # 垂直翻转

色彩与通道操作

灰度化

img_gray = img.convert('L')  # 模式'L'为8位灰度
# 其他模式:'1'(二值), 'RGB', 'RGBA', 'CMYK'

通道分离与合并

r, g, b = img.split()  # 返回三个灰度图像
merged = Image.merge('RGB', (r, g, b))
# 调整某个通道的亮度
r = r.point(lambda x: x * 1.5)  # 增强红色通道

调色板模式(P模式)

img_p = img.quantize(colors=64)  # 将真彩图转为256色以内
# 适用于GIF、图标等场景

图像滤镜与增强

Pillow内置了ImageFilter模块和ImageEnhance模块。

常用滤镜

from PIL import ImageFilter
blur = img.filter(ImageFilter.BLUR)  # 模糊
sharp = img.filter(ImageFilter.SHARPEN)  # 锐化
edge = img.filter(ImageFilter.FIND_EDGES)  # 边缘检测
emboss = img.filter(ImageFilter.EMBOSS)  # 浮雕效果

增强参数调节

from PIL import ImageEnhance
enhancer = ImageEnhance.Contrast(img)
img_contrast = enhancer.enhance(2.0)  # 对比度加倍
enhancer2 = ImageEnhance.Brightness(img)
img_bright = enhancer2.enhance(1.5)  # 亮度提高50%
enhancer3 = ImageEnhance.Sharpness(img)
img_sharp = enhancer3.enhance(2.0)  # 锐度增强

文本与图形绘制

使用ImageDraw模块可以在图像上绘制线条、矩形、椭圆和文字。

from PIL import ImageDraw, ImageFont
draw = ImageDraw.Draw(img)
# 绘制矩形
draw.rectangle([50, 50, 200, 150], outline='red', width=3)
# 绘制文本
font = ImageFont.truetype('arial.ttf', 36)
draw.text((100, 100), "Hello Pillow", fill='blue', font=font)
# 绘制圆形
draw.ellipse([300, 50, 400, 150], fill='green', outline='black')

字体注意:中文环境需使用支持中文的字体文件(如微软雅黑),否则会出现乱码。


实战案例:批量加水印脚本

以下脚本将遍历input文件夹内所有图片,添加半透明文字水印并输出到output文件夹。

import os
from PIL import Image, ImageDraw, ImageFont
def add_watermark(input_dir, output_dir, text="Copyright", font_size=40, opacity=60):
    os.makedirs(output_dir, exist_ok=True)
    for fname in os.listdir(input_dir):
        if fname.lower().endswith(('.jpg', '.png', '.jpeg')):
            img = Image.open(os.path.join(input_dir, fname)).convert('RGBA')
            # 创建透明图层
            txt_layer = Image.new('RGBA', img.size, (255,255,255,0))
            draw = ImageDraw.Draw(txt_layer)
            font = ImageFont.truetype("arial.ttf", font_size)
            # 计算文本居中位置(可改为右下角)
            text_width, text_height = draw.textsize(text, font=font)
            x = (img.width - text_width) // 2
            y = (img.height - text_height) // 2
            # 半透明白色文字
            draw.text((x, y), text, font=font, fill=(255,255,255,opacity))
            # 合并图层
            watermarked = Image.alpha_composite(img, txt_layer)
            watermarked = watermarked.convert('RGB')  # 保存为JPEG需转RGB
            watermarked.save(os.path.join(output_dir, fname), 'JPEG', quality=90)
# 使用示例
add_watermark('./input', './output', text='MySite.com')

运行效果:每张图片中央出现半透明水印,且原图不被覆盖。


常见问题与问答(FAQ)

Q1:处理大图片时内存占用过高怎么办?

A:避免一次性加载全分辨率图片,使用Image.open()后,立即调用thumbnail()resize()缩小尺寸,对于超大图片(如5000万像素),可使用Image.open()pyramid参数(部分格式支持)或分块处理。

Q2:Pillow无法打开某些格式(如WebP、HEIC)?

A:Pillow默认支持常见格式,但WebP需安装libwebp-dev,HEIC需额外安装pillow-heif插件,建议使用pip install pillow[heif,webp]安装扩展包。

Q3:图片旋转后出现黑边怎么办?

A:使用rotate(angle, expand=True, fillcolor=(R,G,B))expand参数自动计算新画布大小,fillcolor填充空白区域,推荐用白色(255,255,255)或透明色(0,0,0,0)。

Q4:如何提高文字水印的抗锯齿效果?

A:使用ImageFont.truetype()加载高质量字体,并在绘制前先创建大图再缩放到目标尺寸,也可使用ImageDraw.Draw.text()stroke_width参数增加描边。

Q5:Pillow与OpenCV如何选择?

A:Pillow适合简单图像处理、格式转换、UI设计;OpenCV适合计算机视觉任务(人脸识别、视频流处理),两者可结合使用:用Pillow读写文件,用OpenCV进行复杂处理。


SEO优化技巧与总结

为了让这篇文章符合必应和谷歌的排名规则,需注意以下几点:

  • 关键词密度:核心词“Python”、“Pillow”、“图像处理”、“常用操作”自然分布在标题、H1-H3标签、段落首句,总密度控制在1.5%-3%。
  • 内部链接:在文章内提及“批量加水印”时,可链接到Python文件操作或脚本编写的相关文章。
  • 外部权威引用:参考Pillow官方文档(本文若出现域名,请替换为[官方文档占位符])和Python官方库文档。
  • 长尾词优化:包含“Python批量转换图片格式”、“Pillow添加水印代码”、“图像滤镜对比度调整”等用户常搜短语。
  • 结构化数据:使用H2/H3标题、代码块、列表、问答格式,方便搜索引擎提取摘要。

Pillow是一个轻量且强大的图像处理工具,从基础的格式转换到高级的滤镜合成,都能用几行Python代码实现,本文涵盖了80%的日常操作场景,建议读者将每个示例在本地运行一遍,并尝试组合不同功能(如先滤镜再添加水印),遇到问题请优先查阅Pillow官方文档,或在Stack Overflow搜索具体报错信息,掌握这些核心操作后,你可以轻松实现微信头像自动处理、电商图片批量调整、验证码生成等实际项目。

抱歉,评论功能暂时关闭!