news 2026/3/1 11:29:03

Day 42:【99天精通Python】图像处理 (Pillow) - 打造你的专属美图秀秀

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day 42:【99天精通Python】图像处理 (Pillow) - 打造你的专属美图秀秀

Day 42:【99天精通Python】图像处理 (Pillow) - 打造你的专属美图秀秀

前言

欢迎来到第42天!

在日常工作中,我们经常需要处理图片:把 100 张大图缩小成缩略图、给证件照换底色、或者给公司所有的宣传图批量加上水印。如果一张张手动用 PS 处理,那真是要累断手。

Python 有一个非常强大的图像处理库——Pillow(PIL Fork)。它提供了广泛的文件格式支持、强大的图像处理能力,API 却非常简单易用。有了它,你就是代码界的修图师。

本节内容:

  • Pillow 安装与基本操作
  • 图像的缩放、旋转与裁剪
  • 常用滤镜 (模糊、轮廓)
  • 图像格式转换 (JPG 转 PNG)
  • 绘制文字 (添加水印)
  • 实战练习:批量图片水印生成器

一、初识 Pillow

Pillow 是 Python Imaging Library (PIL) 的一个友好分支,依然使用PIL作为包名。

安装:

pipinstallPillow

1.1 打开与显示图片

我们需要一张测试图片(假设名为test.jpg)。

fromPILimportImage# 1. 打开图片# img 是一个 Image 对象try:img=Image.open("test.jpg")exceptFileNotFoundError:print("图片未找到,请准备一张 test.jpg")exit()# 2. 查看属性print(f"格式:{img.format}")# JPEGprint(f"尺寸:{img.size}")# (1920, 1080) -> (宽, 高)print(f"模式:{img.mode}")# RGB# 3. 显示图片 (会调用系统默认图片查看器打开)img.show()

1.2 格式转换与保存

# 另存为 PNGimg.save("test.png")# 转换模式 (如转为灰度图)# 'L' 表示灰度模式grey_img=img.convert("L")grey_img.save("test_grey.jpg")

二、图像变换:剪裁、旋转、缩放

2.1 缩放 (Resize)

改变图片大小是刚需。Pillow 提供了resizethumbnail两种方法。

# 1. resize: 强制改变大小 (可能会变形)# 注意参数是一个元组 (width, height)new_img=img.resize((300,200))new_img.show()# 2. thumbnail: 等比缩放 (制作缩略图)# 它会原地修改对象,且保持长宽比,不会超过指定尺寸img.thumbnail((300,300))img.save("thumbnail.jpg")

2.2 裁剪 (Crop)

# 定义裁剪区域: (左, 上, 右, 下)# 坐标原点 (0,0) 在左上角box=(100,100,500,500)region=img.crop(box)region.show()

2.3 旋转与翻转 (Rotate & Transpose)

# 旋转 45 度img.rotate(45).show()# 左右镜像翻转img.transpose(Image.FLIP_LEFT_RIGHT).show()# 上下翻转# img.transpose(Image.FLIP_TOP_BOTTOM).show()

三、神奇滤镜 (Filters)

想给照片加点特效?ImageFilter模块内置了多种滤镜。

fromPILimportImageFilter# 高斯模糊 (Radius 指定模糊程度)blur_img=img.filter(ImageFilter.GaussianBlur(radius=5))blur_img.show()# 轮廓滤镜 (也就是线稿风格)contour_img=img.filter(ImageFilter.CONTOUR)contour_img.show()# 锐化sharp_img=img.filter(ImageFilter.SHARPEN)

四、实战:给图片加水印

这是最实用的功能之一。我们需要用到ImageDraw(画笔) 和ImageFont(字体)。

4.1 绘制文字

fromPILimportImage,ImageDraw,ImageFont# 1. 打开底图base_img=Image.open("test.jpg")# 2. 创建一个可以在 base_img 上绘画的对象draw=ImageDraw.Draw(base_img)# 3. 加载字体# Windows 字体路径通常在 C:/Windows/Fonts/# Mac/Linux 请替换为你的字体路径# 如果找不到字体,可以用默认字体 load_default(),但不支持中文try:# 这里的 50 是字号font=ImageFont.truetype("arial.ttf",50)exceptIOError:font=ImageFont.load_default()# 4. 绘制文字# xy: 坐标, text: 内容, fill: 颜色(RGB), font: 字体text="Copyright @ Python"draw.text((50,50),text,fill=(255,0,0),font=font)# 5. 保存base_img.show()base_img.save("watermarked.jpg")

五、综合项目:批量图片水印工具

我们要写一个脚本,自动遍历images文件夹下的所有图片,在右下角加上半透明的水印,并保存到output文件夹。

importosfromPILimportImage,ImageDraw,ImageFontdefadd_watermark(input_path,output_path,text="Python Pro"):try:# 打开图片并转为 RGBA (支持透明度)img=Image.open(input_path).convert("RGBA")width,height=img.size# 创建一个透明的图层用于画水印txt_layer=Image.new("RGBA",img.size,(255,255,255,0))draw=ImageDraw.Draw(txt_layer)# 设置字体 (尽量找个存在的字体文件)try:font_size=int(width/20)# 根据图片宽度动态调整字号font=ImageFont.truetype("arial.ttf",font_size)except:font=ImageFont.load_default()# 计算文字大小 (getbbox 返回 (左, 上, 右, 下))bbox=draw.textbbox((0,0),text,font=font)text_width=bbox[2]-bbox[0]text_height=bbox[3]-bbox[1]# 计算位置 (右下角,留点边距)x=width-text_width-20y=height-text_height-20# 绘制水印 (最后一个参数 128 是透明度 alpha,0-255)# 注意:fill 的 RGBA 中 A=128 控制文字半透明draw.text((x,y),text,font=font,fill=(255,255,255,128))# 合并图层result=Image.alpha_composite(img,txt_layer)# 保存 (转回 RGB 存为 JPG,或者直接存 PNG)# 如果要存 JPG,必须转 RGB (因为 JPG 不支持透明)result.convert("RGB").save(output_path)print(f"处理完成:{output_path}")exceptExceptionase:print(f"处理失败{input_path}:{e}")defbatch_process():src_dir="images"dst_dir="output"ifnotos.path.exists(src_dir):print(f"请先创建{src_dir}文件夹并放入图片")returnifnotos.path.exists(dst_dir):os.makedirs(dst_dir)forfilenameinos.listdir(src_dir):iffilename.lower().endswith(('.png','.jpg','.jpeg')):in_path=os.path.join(src_dir,filename)out_path=os.path.join(dst_dir,filename)add_watermark(in_path,out_path)if__name__=="__main__":batch_process()

六、常见问题

Q1:Image.open报错UnidentifiedImageError

这通常是因为文件损坏,或者不是有效的图片格式(只是改了后缀名)。

Q2:PNG 图片加水印后背景变黑了?

JPG 不支持透明通道。如果你处理的是透明背景的 PNG,保存为 JPG 时透明部分会变成黑色。解决方法是保存为 PNG,或者在convert("RGB")之前创建一个白色背景层进行合并。

Q3:如何截屏?

Pillow 的ImageGrab模块可以截屏。

fromPILimportImageGrab im=ImageGrab.grab()im.show()

七、小结

Pillow 图像处理

基本操作

图像变换

绘图 Draw

open() / save()

convert() 格式转换

resize() / thumbnail()

crop() 裁剪

rotate() 旋转

filter() 滤镜

ImageDraw.Draw()

draw.text() 写字

ImageFont 设置字体

关键要点

  1. 缩略图thumbnail,保持比例不失真。
  2. 坐标系原点在左上角,向右X轴,向下Y轴。
  3. 加水印需要创建ImageDraw对象,如有透明度需求需使用 RGBA 模式。

八、课后作业

  1. 九宫格切图:编写一个函数,将一张正方形图片切割成 9 张小图(朋友圈九宫格效果),保存到文件夹中。
  2. 验证码生成器:创建一个空白图片,随机生成 4 个字母画上去,并添加一些随机的噪点或线条(干扰线),模拟网站验证码。
  3. 头像圆角化:将一张方形头像裁剪成圆形(提示:使用ImageOps或遮罩 Mask 技术)。

下节预告

Day 43:发送邮件 (smtplib)- 程序跑完了,结果怎么通知我?明天我们学习如何用 Python 自动发送邮件(包含附件和漂亮的 HTML 格式)。


系列导航

  • 上一篇:Day 41 - 定时任务Schedule
  • 下一篇:Day 43 - 发送邮件smtplib(待更新)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/28 16:12:21

如何用YOLOv10解决小目标漏检?实际场景方案分享

如何用YOLOv10解决小目标漏检?实际场景方案分享 在工业质检、无人机巡检和智能交通等实际应用中,小目标检测始终是目标检测任务中的“硬骨头”。例如,在PCB板缺陷检测中,一个微小的焊点缺失可能只有几个像素大小;在高…

作者头像 李华
网站建设 2026/2/23 1:31:55

2026企业微信社群管理:智能质检如何助力企业高效服务与合规运营

2026年,企业微信社群管理的核心难题与破局关键2026年,企业微信社群已从“可选工具”升级为客户服务的核心阵地。据企业微信官方白皮书数据,企业通过社群触达的客户占比超65%,单企业日均社群消息量较2025年增长40%。但繁荣背后&…

作者头像 李华
网站建设 2026/2/24 16:10:11

Qwen3-VL-WEB转化路径:引导用户购买GPU算力的自然衔接设计

Qwen3-VL-WEB转化路径:引导用户购买GPU算力的自然衔接设计 1. 引言:从模型能力到用户转化的关键跃迁 随着大模型在多模态理解与生成能力上的持续突破,如何将强大的AI能力有效转化为可持续的商业价值,成为智能服务产品设计中的核…

作者头像 李华
网站建设 2026/2/28 17:27:02

零基础搭建ASR系统:用Paraformer镜像实现中文语音转文字

零基础搭建ASR系统:用Paraformer镜像实现中文语音转文字 1. 引言 1.1 语音识别的现实需求 在智能硬件、会议记录、客服系统和内容创作等场景中,将语音高效准确地转化为文字已成为一项刚需。传统的语音识别方案往往依赖云端服务,存在隐私泄…

作者头像 李华
网站建设 2026/2/18 16:36:00

低成本GPU方案部署GPEN:照片修复镜像免配置快速上手

低成本GPU方案部署GPEN:照片修复镜像免配置快速上手 1. 引言 1.1 背景与需求 在图像处理领域,老旧照片修复、低质量人像增强等任务正越来越多地依赖深度学习技术。传统方法受限于细节恢复能力弱、人工干预多等问题,难以满足实际应用中对自…

作者头像 李华
网站建设 2026/2/23 7:48:54

Qwen3-VL-2B案例分享:教育图解题库构建

Qwen3-VL-2B案例分享:教育图解题库构建 1. 背景与需求分析 1.1 教育场景中的图解题挑战 在K12及高等教育中,数学、物理、化学等STEM学科的题目常常以图文结合的形式呈现。传统的文本型题库难以有效处理包含几何图形、函数图像、实验装置图等内容的题目…

作者头像 李华