0

0

Python怎样实现图像处理?Pillow库使用教程

蓮花仙者

蓮花仙者

发布时间:2025-07-05 12:22:01

|

864人浏览过

|

来源于php中文网

原创

pillow是python中最常用且方便的图像处理库,它提供直观接口实现图像读取、修改和保存。核心操作包括:1. 安装简单(pip install pillow);2. 使用image对象进行图像处理;3. 支持打开、调整大小、裁剪、旋转、颜色转换、应用滤镜、绘制文字等基础操作;4. 提供性能优化策略如及时释放内存、分块处理、调整尺寸、选择合适文件格式与压缩参数;5. 适用于web应用图片处理、桌面脚本、数据预处理等场景,相比opencv和scikit-image更轻量易用,适合基础图像编辑任务。

Python怎样实现图像处理?Pillow库使用教程

Python实现图像处理,最常用也最方便的库无疑是Pillow。它能让你轻松搞定图像的读取、修改、保存等一系列操作,无论是简单的缩放裁剪,还是更复杂的滤镜应用,Pillow都能提供直观的接口,让开发者快速上手。

Python怎样实现图像处理?Pillow库使用教程

解决方案

说起用Python处理图像,我个人最信赖的就是Pillow库。它其实是老牌PIL(Python Imaging Library)的一个积极维护的分支,功能强大,而且用起来特别顺手。

Python怎样实现图像处理?Pillow库使用教程

首先,安装Pillow非常简单,一个pip命令就搞定: pip install Pillow

Pillow的核心是Image对象。所有的图像操作都围绕这个对象进行。

立即学习Python免费学习笔记(深入)”;

Python怎样实现图像处理?Pillow库使用教程

基础操作流程:

  1. 打开图像:Image.open()函数加载一张图片。
  2. 操作图像:Image对象调用各种方法,比如resize()(调整大小)、crop()(裁剪)、rotate()(旋转)等等。
  3. 保存图像:Image.save()方法将修改后的图像保存到文件。

一个简单的例子:调整图片大小并保存

from PIL import Image

try:
    # 假设你的图片在当前目录下
    img = Image.open('example.jpg') 
    print(f"原始图片尺寸: {img.size}")

    # 定义新的尺寸,比如宽度减半,高度等比例缩放
    new_width = img.width // 2
    new_height = img.height // 2 # 也可以根据比例计算,这里简化
    resized_img = img.resize((new_width, new_height))

    # 保存为新的文件,可以指定格式
    resized_img.save('example_resized.png') 
    print(f"图片已成功缩放并保存为 example_resized.png,新尺寸: {resized_img.size}")

except FileNotFoundError:
    print("错误:未找到 'example.jpg' 文件,请确保图片在正确路径。")
except Exception as e:
    print(f"处理图片时发生错误: {e}")

这个流程几乎涵盖了你日常处理图片的大部分场景,你只需要根据需求调用不同的方法。

Pillow能做哪些常见的图像操作?

Pillow的功能远不止缩放和保存那么简单,它几乎覆盖了我们日常能想到的所有基础图像处理需求。我平时最常用到的,除了上面提到的调整大小,还有以下这些:

  • 裁剪 (Crop): 想象一下你拍了张照片,只想保留其中某个区域。img.crop((left, upper, right, lower))就能实现,传入一个四元组,定义裁剪框的左上角和右下角坐标。这在生成头像或者缩略图时特别有用。

    # 裁剪图片,从(100, 100)到(300, 300)的区域
    cropped_img = img.crop((100, 100, 300, 300))
    cropped_img.save('example_cropped.jpg')
  • 旋转 (Rotate): 图片拍歪了?或者需要生成不同角度的展示图?img.rotate(angle, expand=True)可以轻松搞定。expand=True会在旋转后自动扩展画布,以适应新尺寸,避免图像被裁切。

    # 旋转图片45度,并扩展画布
    rotated_img = img.rotate(45, expand=True)
    rotated_img.save('example_rotated.jpg')
  • 颜色模式转换 (Color Conversion): 有时候你需要把彩色图片转成黑白,或者反过来。img.convert('L')可以转为灰度图(L代表Luminance),'RGB'则转为RGB模式。这个功能在做一些图像分析或者为了节省存储空间时非常实用。

    # 转换为灰度图
    gray_img = img.convert('L')
    gray_img.save('example_gray.jpg')
  • 应用滤镜 (Filters): Pillow内置了一些基础滤镜,比如模糊、锐化、浮雕等。它们都在PIL.ImageFilter模块里。虽然没有Photoshop那么复杂,但对于快速实现一些效果已经足够了。

    拍我AI
    拍我AI

    AI视频生成平台PixVerse的国内版本

    下载
    from PIL import ImageFilter
    
    # 应用高斯模糊滤镜
    blurred_img = img.filter(ImageFilter.GaussianBlur(radius=5))
    blurred_img.save('example_blurred.jpg')
  • 绘制图形和文字 (Drawing): 如果你想在图片上加个水印、画个框或者写段文字,PIL.ImageDraw模块就是你的好帮手。它提供了一系列绘制方法,比如line()rectangle()text()等。

    from PIL import ImageDraw, ImageFont
    
    draw = ImageDraw.Draw(img)
    
    # 尝试加载一个字体文件,如果失败就用默认字体
    try:
        font = ImageFont.truetype("arial.ttf", 40) # 假设arial.ttf存在
    except IOError:
        font = ImageFont.load_default()
        print("警告:未找到arial.ttf,使用默认字体。")
    
    # 在图片上添加文字
    text_color = (255, 255, 255) # 白色
    draw.text((50, 50), "Hello, Pillow!", font=font, fill=text_color)
    img.save('example_with_text.jpg')

    这些操作,我几乎在每个涉及到图片处理的项目里都会用到,它们真的让很多繁琐的工作变得轻松。

处理图像时,Pillow有哪些性能考量和注意事项?

用Pillow处理图像确实方便,但如果你处理的图片量大、尺寸惊人,或者是在一些资源有限的环境下运行,还是有些性能和使用上的“小坑”需要注意的。我个人就遇到过几次因为大图导致内存飙升,服务直接崩掉的情况。

  1. 内存占用 这是最常见的问题。当你用Image.open()打开一张图片时,Pillow会把整张图片的数据加载到内存中。如果图片尺寸特别大(比如几千上万像素,或者几百兆的文件),那内存占用就会非常可观。

    • 解决方案:
      • 及时释放: 在处理完图片后,如果不再需要这个Image对象,可以考虑将其引用设为None,并让Python的垃圾回收机制处理它。
      • 分块处理(复杂场景): 对于超大图片,可以考虑分块读取和处理,但这会增加代码复杂性,Pillow本身没有直接提供分块接口,可能需要结合numpy或其他库。
      • 调整尺寸再处理: 如果最终输出的图片不需要那么高的分辨率,可以在一开始就将其resize()到合理的大小,这样后续操作的内存开销会小很多。
  2. 文件格式与压缩: 保存图片时选择合适的格式和压缩参数也很重要。

    • JPEG: 有损压缩,适合照片,文件小,但每次保存都会有质量损失。你可以通过save()方法的quality参数控制压缩质量(0-100)。
    • PNG: 无损压缩,支持透明度,适合图标、截图等。文件通常比JPEG大。
    • WEBP: 现代格式,通常比JPEG和PNG更小,同时保持较好的质量,但兼容性可能略差于前两者。
    • 最佳实践: 根据你的应用场景选择。如果对质量要求高且文件大小不敏感,用PNG。如果追求小文件且允许一定损失,用JPEG。
  3. 批量处理效率: 当你需要处理成千上万张图片时,简单的循环处理可能会很慢。

    • 并行处理: 可以考虑使用Python的multiprocessingconcurrent.futures模块进行多进程处理,充分利用多核CPU。每个进程处理一部分图片,能显著提高效率。
    • 避免重复加载: 确保你的代码逻辑中,图片只被加载一次,然后进行所有操作,最后保存。
  4. 错误处理: 别忘了加上try-except块来处理可能出现的错误,比如文件找不到、图片格式损坏、内存不足等。这能让你的程序更健壮。

    from PIL import Image
    
    image_paths = ['valid_image.jpg', 'non_existent.png', 'corrupted.gif']
    
    for path in image_paths:
        try:
            img = Image.open(path)
            print(f"成功打开: {path}, 尺寸: {img.size}")
            # 进行一些操作
            img.save(f"processed_{path}")
        except FileNotFoundError:
            print(f"错误:文件 '{path}' 未找到。")
        except Image.UnidentifiedImageError:
            print(f"错误:'{path}' 不是有效的图片文件,或格式无法识别。")
        except Exception as e:
            print(f"处理 '{path}' 时发生未知错误: {e}")

    这些细节,往往在开发初期容易被忽略,但一旦项目规模上来,它们就会成为影响稳定性和性能的关键点。

Pillow与其他图像处理库相比,有什么优势或适用场景?

Python生态里图像处理的库可不止Pillow一个,比如还有OpenCV、scikit-image等等。它们各有侧重,选择哪个取决于你的具体需求。我用下来感觉,Pillow的优势和适用场景还是挺明确的:

  1. 优势:

    • 极简易用: 这是Pillow最大的亮点。它的API设计非常直观,学习曲线平缓,对于大多数常见的图像操作,你几乎不需要查太多文档就能上手。如果你只是想快速完成一些图像的裁剪、缩放、格式转换、加水印这类任务,Pillow简直是首选。
    • 轻量级: 相比OpenCV这种“大块头”,Pillow更轻量,依赖少,安装简单。这使得它非常适合集成到Web应用后端(比如Django、Flask)进行图片上传处理、生成缩略图等。
    • 文档清晰、社区活跃: 作为PIL的继任者,Pillow的文档非常完善,社区也很活跃,遇到问题很容易找到解决方案。
    • 专注图像基础操作: 它聚焦于图像文件的读写、基本像素操作、几何变换和色彩空间转换,把这些基础功能做到了极致。
  2. 适用场景:

    • Web应用中的图片处理: 比如用户上传头像后,自动生成不同尺寸的缩略图;电商网站的产品图批量处理;给图片加水印;验证码生成等。Pillow在这里表现得非常出色,因为它高效且易于部署。
    • 桌面应用或脚本: 编写一些自动化脚本来批量处理本地图片,例如批量重命名、调整图片大小以适应某个屏幕、简单的图像格式转换。
    • 数据预处理: 在机器学习或深度学习项目中,你可能需要对图像数据集进行预处理,比如统一图片尺寸、转换为灰度图、进行简单的增强(旋转、翻转)。Pillow可以作为这个流程中快速、可靠的一环。
    • 简单的图像编辑工具 如果你只是想开发一个功能不复杂的图像查看器或编辑器,Pillow能提供足够的基础能力。
  3. 与OpenCV/scikit-image的对比:

    • OpenCV (Open Source Computer Vision Library): 这是一个为计算机视觉任务而生的库。它拥有大量高级算法,如特征检测、目标识别、人脸识别、视频处理等。如果你需要进行复杂的图像分析、机器视觉算法开发,那OpenCV是你的不二之选。Pillow在这方面就显得力不从心了。简单来说,Pillow是“修图”,OpenCV是“看图懂图”。
    • scikit-image: 这是一个基于NumPy的图像处理库,更偏向于科学计算和图像分析。它提供了很多图像分割、特征提取、形态学操作等算法,与科学计算生态结合紧密。如果你在进行科研、需要对图像进行深入的数学分析,scikit-image会是更好的选择。

所以,我的经验是,如果你只是需要快速、高效地处理图像文件,做一些常见的几何变换和色彩调整,Pillow绝对是你的首选。而如果你的需求涉及更复杂的计算机视觉算法或科学图像分析,那可能就需要转向OpenCV或scikit-image了。它们之间并不是竞争关系,更多的是互补。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

163

2026.02.04

Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

104

2025.08.25

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

81

2025.12.15

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

373

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

436

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

802

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

370

2025.07.23

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1923

2023.10.19

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号