Python使用PIL库实现图像圆形裁剪

 更新时间:2025年07月16日 10:43:40   作者:nightunderblackcat  
本文将详细介绍如何使用Python的Pillow库(PIL)实现一个实用的图像处理任务——将图片裁剪为圆形,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

本文将详细介绍如何使用Python的Pillow库(PIL)实现一个实用的图像处理任务——将图片裁剪为圆形。这个功能在创建用户头像、产品展示等场景中非常常见。

本教程面向Python初学者,假设读者已具备基本的Python语法知识。我们将从环境准备开始,逐步解析代码的每一部分,确保读者不仅能理解代码的功能,还能掌握背后的原理。

环境准备

在开始之前,我们需要确保已安装必要的Python库。本教程主要使用Pillow库(Python Imaging Library的分支版本),它是Python中最流行的图像处理库之一。

安装Pillow

打开命令行或终端,输入以下命令安装Pillow:

pip install pillow

安装完成后,可以通过以下命令验证是否安装成功:

from PIL import Image
print(Image.__version__)

如果没有报错并显示版本号,则说明安装成功。

代码结构概览

我们将要分析的代码主要完成以下功能:

  • 指定输入和输出文件夹路径
  • 创建输出文件夹(如果不存在)
  • 遍历输入文件夹中的所有图片文件
  • 将每张图片裁剪为圆形
  • 保存处理后的图片到输出文件夹

让我们逐部分详细解析这段代码。

代码详细解析

1. 导入必要的库

from PIL import Image, ImageDraw
import os
  • PIL.Image:Pillow库的核心模块,用于打开、操作和保存多种图像格式
  • PIL.ImageDraw:提供基本的2D图形绘制功能,用于创建圆形蒙版
  • os:Python标准库,提供与操作系统交互的功能,主要用于文件路径操作

2. 设置输入输出路径

input_folder = r'E:\Downloads\压缩文件'
output_folder = r'E:\Downloads\西游记111'
  • input_folder:原始图片所在的文件夹路径
  • output_folder:处理后的图片保存路径
  • r前缀:表示原始字符串(raw string),避免转义字符(如\n)被特殊处理

注意事项

路径中使用双反斜杠\\或原始字符串r''是Windows系统中的常见做法

在实际应用中,这些路径应作为参数或配置文件项,而非硬编码

3. 创建输出目录

if not os.path.exists(output_folder):
    os.makedirs(output_folder)
  • os.path.exists():检查路径是否存在
  • os.makedirs():创建目录(包括所有必要的父目录)

最佳实践

  • 总是检查目录是否存在再创建,避免不必要的异常
  • 考虑添加错误处理,例如权限不足等情况

4. 遍历输入文件夹

for filename in os.listdir(input_folder):
    if filename.endswith(('.png', '.jpg', '.jpeg')):  # 支持常见的图片格式
  • os.listdir():列出目录中的所有文件和子目录
  • str.endswith():检查文件名是否以指定后缀结尾(支持元组形式的多后缀匹配)

扩展说明

  • 可以添加更多图片格式如.bmp.webp
  • 考虑使用os.path.splitext()获取文件扩展名进行更精确的匹配

5. 打开并预处理图片

img_path = os.path.join(input_folder, filename)
img = Image.open(img_path)
 
size = min(img.size)
img = img.resize((size, size))  # 缩放图片为正方形
  • os.path.join():跨平台安全的路径拼接方法
  • Image.open():打开图像文件但不立即读取数据(延迟加载)
  • img.size:返回图像的(宽度, 高度)元组
  • min():获取较小的边长
  • resize():调整图像尺寸

图像处理原理

  • 圆形裁剪需要正方形作为基础,因此先获取最小边作为正方形边长
  • resize()默认使用Image.NEAREST(最近邻插值),可指定更高质量的方法如Image.BICUBIC

6. 创建圆形蒙版

mask = Image.new('L', (size, size), 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0, size, size), fill=255)

Image.new():创建新图像

  • 模式'L':8位灰度像素(0黑,255白)
  • 初始填充值0:黑色背景

ImageDraw.Draw():创建绘图对象

ellipse():绘制椭圆/圆形

  • 参数:(左上x, 左上y, 右下x, 右下y)
  • fill=255:白色填充

蒙版概念

蒙版是图像处理中的常见技术,用于定义哪些区域应该显示/隐藏

在Pillow中,蒙版通常使用灰度图像,其中:

  • 255(白):完全显示
  • 0(黑):完全透明
  • 中间值:部分透明

7. 应用蒙版创建圆形图像

img_with_circle = Image.new("RGBA", (size, size), (0, 0, 0, 0))
img_with_circle.paste(img, (0, 0), mask)

Image.new("RGBA"):创建透明背景图像

  • RGBA模式:Red, Green, Blue, Alpha(透明度)
  • (0,0,0,0):完全透明黑色

paste():粘贴图像

  • 第一个参数:要粘贴的图像
  • 第二个参数:位置坐标
  • 第三个参数:蒙版图像

透明度处理

  • PNG格式支持Alpha通道,因此使用RGBA模式
  • 背景初始化为完全透明,确保圆形外的区域透明

8. 保存处理后的图像

new_filename = os.path.splitext(filename)[0] + '.png'
output_path = os.path.join(output_folder, new_filename)
img_with_circle.save(output_path, 'PNG')

os.path.splitext():分割文件名和扩展名

save():保存图像

  • 指定'PNG'格式以保留透明度
  • 自动根据扩展名确定格式(但显式指定更可靠)

文件格式选择

  • PNG:无损压缩,支持透明度
  • JPEG:有损压缩,不支持透明度
  • 可根据需求调整输出格式

9. 进度反馈

print(f"图片 {filename} 裁剪完成,保存至 {output_path}")
print("所有图片都已裁剪完成~ (。♥‿♥。)")
  • 提供处理进度反馈
  • 最终完成提示

用户体验建议

  • 可添加计数器显示进度(如"处理第n张/共m张")
  • 考虑使用更专业的进度条库(如tqdm)

完整代码回顾

from PIL import Image, ImageDraw
import os
 
# 输入和输出文件夹路径
input_folder = r'E:\Downloads\压缩文件'
output_folder = r'E:\Downloads\西游记111'
 
# 如果输出文件夹不存在,就创建一个
if not os.path.exists(output_folder):
    os.makedirs(output_folder)
 
# 遍历输入文件夹中的所有图片文件
for filename in os.listdir(input_folder):
    if filename.endswith(('.png', '.jpg', '.jpeg')):  # 支持常见的图片格式
        # 打开图片
        img_path = os.path.join(input_folder, filename)
        img = Image.open(img_path)
 
        # 以图片的最小边为圆形裁剪的边长
        size = min(img.size)
        img = img.resize((size, size))  # 缩放图片为正方形
 
        # 创建一个圆形蒙版
        mask = Image.new('L', (size, size), 0)
        draw = ImageDraw.Draw(mask)
        draw.ellipse((0, 0, size, size), fill=255)  # 绘制白色的圆形
 
        # 创建一个透明背景的图片
        img_with_circle = Image.new("RGBA", (size, size), (0, 0, 0, 0))  # 背景为透明
        img_with_circle.paste(img, (0, 0), mask)  # 使用圆形蒙版将图片粘贴到透明背景上
 
        # 生成新的文件名,原文件名加上 "1"
        new_filename = os.path.splitext(filename)[0] + '.png'
        output_path = os.path.join(output_folder, new_filename)
 
        # 保存为PNG格式
        img_with_circle.save(output_path, 'PNG')
 
        print(f"图片 {filename} 裁剪完成,保存至 {output_path}")
 
print("所有图片都已裁剪完成~ (。♥‿♥。)")

代码优化建议

参数化配置:将输入输出路径、支持的文件格式等作为函数参数或配置文件

错误处理:添加try-catch块处理可能的异常(如文件损坏、权限问题等)

性能优化:对于大量图片,可考虑并行处理

日志记录:替代简单的print语句,使用logging模块

单元测试:为关键功能编写测试用例

扩展功能思路

自定义形状:修改代码支持心形、星形等其他形状

边框添加:在圆形图像周围添加装饰性边框

批量重命名:更灵活的文件命名规则

预览功能:处理前显示预览

GUI界面:使用Tkinter等库创建图形界面

常见问题解答

Q1: 为什么处理后图片质量下降了?

A: 可能是因为resize()使用了默认的最近邻插值,可尝试:

img = img.resize((size, size), Image.BICUBIC)

Q2: 如何处理非正方形图片?

A: 当前代码会自动取最小边,也可以选择:

  • 保持原比例,在圆形外留透明区域
  • 裁剪中心区域而非缩放

Q3: 如何支持更多图片格式?

A: 扩展endswith的元组参数,如:

if filename.endswith(('.png', '.jpg', '.jpeg', '.webp', '.bmp')):

Q4: 处理大图片时内存不足怎么办?

A: 可以:

  • 限制处理图片的最大尺寸
  • 使用更高效的内存处理方式
  • 分块处理图片

总结

本文详细解析了一个实用的Python图像处理脚本,它使用Pillow库将图片裁剪为圆形。通过学习这段代码,我们掌握了:

  • Pillow库的基本图像操作
  • 蒙版技术的应用
  • 文件批量处理的模式
  • 透明图像的处理方法

希望读者不仅能理解这段代码,更能举一反三,应用到其他图像处理任务中。编程学习的关键在于实践,建议读者尝试修改和扩展这段代码,以巩固所学知识。

附录:Pillow库常用方法速查

方法/属性说明
Image.open()打开图像文件
Image.new()创建新图像
Image.save()保存图像
Image.resize()调整尺寸
ImageDraw.Draw()创建绘图对象
Image.paste()粘贴图像
img.size图像尺寸(宽,高)
img.format图像格式
img.mode图像模式(RGB, RGBA等)

到此这篇关于Python使用PIL库实现图像圆形裁剪的文章就介绍到这了,更多相关Python PIL图像裁剪内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java虚拟机中栈的运行知识点总结

    java虚拟机中栈的运行知识点总结

    在本篇文章里小编给大家整理的是一篇关于java虚拟机中栈的运行知识点总结,有需要的朋友们可以学习参考下。
    2021-06-06
  • 解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享

    解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享

    问题描述:PyQt 环境正常,可以使用 Windows 的 虚拟 DOS 正常运行,但在 Sublime Text 2 下使用 Ctrl + B 运行后,界面不显示,但查看任务管理器,有 python.exe 进程。
    2014-06-06
  • Python下载ts文件视频且合并的操作方法

    Python下载ts文件视频且合并的操作方法

    ts文件,ts即"Transport Stream"的缩写,特点就是要求从视频流的任一片段开始都是可以独立解码的,非常适合网络视频播放,这篇文章主要介绍了Python下载ts文件视频且合并,需要的朋友可以参考下
    2023-01-01
  • Python一些线程的玩法总结

    Python一些线程的玩法总结

    今天给大家带来的是关于Python的一些知识,文章围绕着Python线程的玩法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 使用python实现省市三级菜单效果

    使用python实现省市三级菜单效果

    本文给大家分享的是使用使用python实现省市三级菜单效果的代码,非常的实用,有需要的小伙伴可以参考下。
    2016-01-01
  • Python解决%matplotlib inline标红底报错问题

    Python解决%matplotlib inline标红底报错问题

    在使用非Jupyter环境如Spyder或PyCharm时,%matplotlib inline会因为是Jupyter特有的魔法命令而导致报错,这条命令是用于Jupyter Notebook或Jupyter Qt Console中,主要作用是将matplotlib的图表直接嵌入到Notebook中显示
    2024-09-09
  • 初学python数学建模之数据导入(小白篇)

    初学python数学建模之数据导入(小白篇)

    本篇文章是小白篇初学python的同学可以来共同学习了,本篇文章主要讲解了python数学建模过程中的第一步数据导入,数据导入是所有数模编程的第一步,比你想象的更重要
    2021-08-08
  • 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法

    这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下
    2015-04-04
  • 使用python实现下拉选择框和页签的方法

    使用python实现下拉选择框和页签的方法

    ttk是Python中的一个模块,它提供了一组用于创建GUI界面的工具和控件,这些控件包括按钮、标签、文本框等,可以帮助开发者更方便地创建用户界面,这篇文章主要介绍了使用python实现下拉选择框和页签的方法,需要的朋友可以参考下
    2023-03-03
  • Python实现控制手机电脑拍照并自动发送邮箱

    Python实现控制手机电脑拍照并自动发送邮箱

    这篇文章主要介绍了如何实现利用Python控制手机电脑拍照并自动发送邮箱,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试
    2022-02-02

最新评论