news 2026/9/2 21:32:06

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/9/2 21:49:43

verl Kubernetes部署:生产级编排实战案例

verl Kubernetes部署:生产级编排实战案例 1. 引言 随着大型语言模型(LLMs)在自然语言处理领域的广泛应用,如何高效地进行模型的后训练成为工业界和学术界共同关注的核心问题。强化学习(Reinforcement Learning, RL&a…

作者头像 李华
网站建设 2026/9/3 0:40:19

Z-Image-Turbo技术问答:关于预置权重的10个高频问题解答

Z-Image-Turbo技术问答:关于预置权重的10个高频问题解答 1. 引言 随着文生图大模型在内容创作、设计辅助和AI艺术等领域的广泛应用,用户对生成速度、图像质量和使用便捷性的要求日益提升。阿里达摩院推出的 Z-Image-Turbo 模型基于 Diffusion Transfor…

作者头像 李华
网站建设 2026/9/2 2:44:33

Qwen3-VL-2B功能测评:图片理解能力到底有多强?

Qwen3-VL-2B功能测评:图片理解能力到底有多强? 1. 引言 随着多模态大模型的快速发展,AI对图像的理解已不再局限于简单的物体识别。以Qwen系列为代表的视觉语言模型(Vision-Language Model, VLM)正在推动图文交互进入…

作者头像 李华
网站建设 2026/9/2 6:13:56

YOLOE镜像LRPC策略揭秘,无提示也能识万物

YOLOE镜像LRPC策略揭秘,无提示也能识万物 在开放词汇表目标检测与分割的前沿探索中,YOLOE(You Only Look Once for Everything)正以其“实时看见一切”的理念重新定义视觉感知边界。不同于传统YOLO系列仅限于封闭类别集的局限&am…

作者头像 李华
网站建设 2026/9/2 22:19:19

ACE-Step商业应用:低成本构建版权自由音乐库方案

ACE-Step商业应用:低成本构建版权自由音乐库方案 1. 背景与需求分析 在数字内容创作日益普及的今天,视频制作、直播、广告、游戏等场景对背景音乐的需求持续增长。然而,传统版权音乐授权成本高、使用限制多,而原创音乐制作又依赖…

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

OpenCV扫描仪实战教程:手把手教你搭建本地扫描服务

OpenCV扫描仪实战教程:手把手教你搭建本地扫描服务 1. 引言 1.1 学习目标 本文将带你从零开始,使用 OpenCV 实现一个功能完整的本地文档扫描服务。你将掌握如何通过纯算法方式完成图像的自动边缘检测、透视矫正和去阴影增强,并最终构建一个…

作者头像 李华