news 2026/5/22 14:50:15

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/5/9 0:50:37

DeepSeek-R1推理耗时优化:批量处理实战技巧分享

DeepSeek-R1推理耗时优化:批量处理实战技巧分享 1. 引言 1.1 业务场景描述 随着大模型在本地化部署中的广泛应用,如何在资源受限的环境下实现高效推理成为工程落地的关键挑战。DeepSeek-R1-Distill-Qwen-1.5B 作为一款基于蒸馏技术压缩至1.5B参数量的…

作者头像 李华
网站建设 2026/5/18 14:40:22

Qwen3-4B-Instruct多语言支持实战:长尾知识覆盖效果评测

Qwen3-4B-Instruct多语言支持实战:长尾知识覆盖效果评测 1. 背景与评测目标 随着大语言模型在多语言场景下的广泛应用,如何有效覆盖非主流语种的“长尾知识”成为衡量模型实用性的关键指标。阿里开源的 Qwen3-4B-Instruct-2507 作为通义千问系列中面向…

作者头像 李华
网站建设 2026/5/10 8:48:52

AI智能二维码工坊实战教程:Python QRCode库调用方法详解

AI智能二维码工坊实战教程:Python QRCode库调用方法详解 1. 学习目标与项目背景 1.1 教程定位 本教程旨在通过一个实际可运行的AI镜像项目——AI智能二维码工坊,深入讲解如何使用 Python 的 qrcode 库 实现高性能、高容错率的二维码生成,并…

作者头像 李华
网站建设 2026/5/8 20:37:42

STM32固件下载前置步骤:STLink驱动安装通俗解释

从零开始搞定STM32烧录:STLink驱动安装全解析 你有没有遇到过这样的场景? 新买的STM32开发板连上电脑,打开STM32CubeProgrammer,点击“Connect”,结果弹出一个冷冰冰的提示: “No ST-Link detected!” …

作者头像 李华
网站建设 2026/5/3 8:32:50

新手入门必看:CosyVoice-300M Lite语音合成服务快速上手

新手入门必看:CosyVoice-300M Lite语音合成服务快速上手 1. 引言 随着人工智能技术的不断演进,语音合成(Text-to-Speech, TTS)正逐步成为智能应用的核心能力之一。从智能客服到有声读物,从语音助手到多语言内容生成&…

作者头像 李华
网站建设 2026/5/18 15:56:35

实测Qwen3-Embedding-4B:32K长文档向量化效果惊艳分享

实测Qwen3-Embedding-4B:32K长文档向量化效果惊艳分享 1. 背景与选型动因 随着大模型应用的深入,检索增强生成(RAG)已成为提升模型知识准确性和时效性的核心技术路径。在这一架构中,文本嵌入模型(Text Em…

作者头像 李华