如何用Python操作图像(PIL/Pillow库)?

用Python操作图像,核心是Pillow库。它支持图像加载、保存、尺寸调整、裁剪、旋转、滤镜应用、颜色增强和文字水印添加。安装命令为pip install Pillow,通过Image.open()读取图片,获取format、size、mode属性后可进行各类变换,如resize()调整大小、crop()裁剪、rotate()旋转,并使用filter()应用模糊等滤镜,ImageEnhance调整亮度对比度,ImageDraw.Draw()配合ImageFont添加文字水印,最终用save()输出新图像,整个流程高效直观,适合批量处理与自动化任务。

如何用python操作图像(pil/pillow库)?

用Python操作图像,最直接、最有效的方法就是利用Pillow库。它其实是Python Imaging Library (PIL) 的一个分支,但更活跃,也更好地支持现代Python版本,能让你轻松实现图像的加载、保存、尺寸调整、裁剪、滤镜应用,甚至是绘制文字和图形等一系列操作。可以说,Pillow就是Python在图像处理领域的瑞士军刀,无论是简单的图片转换,还是复杂的自动化任务,它都能胜任。

解决方案

要用Python操作图像,核心就是Pillow库。它的工作流程通常是这样的:首先,你需要安装Pillow。然后,通过

Image.open()

加载一张图片到内存中,得到一个

Image

对象。这个对象就是你进行所有操作的载体。你可以对它进行各种变换,比如调整大小、旋转、裁剪。完成修改后,再用

Image.save()

将处理后的图片保存到文件系统。整个过程直观且高效,尤其适合批量处理或集成到更大的自动化脚本中。

Pillow库的安装与基础图像加载、保存技巧

刚开始接触图像处理时,我发现很多人,包括我自己,都会有点迷茫,到底是用PIL还是Pillow?其实很简单,现在就用Pillow。它是PIL的现代化和积极维护版本,支持Python 3,功能也更完善。安装它,简直是小菜一碟,命令行里敲一行代码就行:

pip install Pillow

安装好之后,我们就可以开始玩转图片了。最基础的,就是怎么把一张图片读进来,再怎么存出去。这听起来简单,但却是所有图像操作的基石。

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

from PIL import Imagetry:    # 加载图片    img = Image.open('example.jpg')     print(f"原始图片格式: {img.format}, 尺寸: {img.size}, 模式: {img.mode}")    # 显示图片(这会调用系统默认的图片查看器,方便调试)    # img.show()     # 将图片保存为不同的格式,比如PNG    img.save('example_output.png')    print("图片已成功保存为 example_output.png")    # 如果你想把图片转成灰度图再保存    gray_img = img.convert('L') # 'L' 代表灰度模式    gray_img.save('example_gray.jpg')    print("图片已成功保存为 example_gray.jpg")except FileNotFoundError:    print("错误:example.jpg 文件未找到。请确保图片文件存在于脚本同级目录。")except Exception as e:    print(f"处理图片时发生错误: {e}")

这里值得一提的是

img.format

img.size

img.mode

format

告诉你图片的原始文件类型(比如JPEG、PNG),

size

是一个元组

(width, height)

,而

mode

则表示图像的像素格式,比如

RGB

(彩色)、

L

(灰度)、

RGBA

(带透明度的彩色)。理解这些,能帮你更好地控制图片处理的结果,比如在处理透明背景图片时,你可能就需要关注

RGBA

模式。

图像尺寸调整、裁剪与旋转:掌握Pillow的核心变换功能

图片处理,最常见的需求无非就是调整大小、裁剪和旋转。Pillow在这些方面做得非常出色,提供了直观的API。但这里有个小细节,Pillow的很多操作,比如

resize

,并不会在原图上直接修改。它们会返回一个新的

Image

对象。初学者很容易忘记这一点,导致代码不按预期执行,所以一定要记得将返回的新对象赋值给一个变量。

from PIL import Imagetry:    img = Image.open('example.jpg')    # 1. 调整尺寸 (Resize)    # 定义新的尺寸,比如宽度500像素,高度按比例缩放    # 或者直接指定 (width, height)    new_width = 500    new_height = int(img.size[1] * (new_width / img.size[0]))    resized_img = img.resize((new_width, new_height), Image.LANCZOS) # LANCZOS是高质量的重采样滤波器    resized_img.save('example_resized.jpg')    print(f"图片已调整尺寸并保存为 example_resized.jpg (新尺寸: {resized_img.size})")    # 2. 裁剪 (Crop)    # 定义裁剪区域:(left, upper, right, lower)    # 比如从左上角开始,裁剪一个200x200的区域    crop_area = (0, 0, 200, 200)     cropped_img = img.crop(crop_area)    cropped_img.save('example_cropped.jpg')    print(f"图片已裁剪并保存为 example_cropped.jpg (裁剪区域: {crop_area})")    # 3. 旋转 (Rotate)    # 旋转45度,并扩展画布以适应旋转后的图像    rotated_img = img.rotate(45, expand=True)     rotated_img.save('example_rotated.jpg')    print("图片已旋转45度并保存为 example_rotated.jpg")except FileNotFoundError:    print("错误:example.jpg 文件未找到。")except Exception as e:    print(f"处理图片时发生错误: {e}")

resize

时,

Image.LANCZOS

是一个非常重要的参数,它指定了重采样滤波器。不同的滤波器在缩放时会有不同的效果,

LANCZOS

通常能提供最好的视觉质量,减少锯齿感。当然,如果你追求速度,也可以选择

Image.NEAREST

Image.BILINEAR

crop

操作的坐标系是从左上角开始的,这和很多图形库的约定一致。而

rotate

expand=True

参数,则能确保旋转后的整个图像内容都能被包含在新图像中,而不是被裁剪掉。这些小细节,往往是决定最终效果的关键。

图像滤镜、颜色调整与文字水印:提升视觉表现力

除了基础的几何变换,Pillow还能让我们对图像的视觉效果进行深度定制。比如应用各种滤镜,调整颜色,或者给图片加上文字水印。这些功能在生成海报、处理用户上传的头像,或者为图片添加版权信息时非常有用。

from PIL import Image, ImageFilter, ImageEnhance, ImageDraw, ImageFonttry:    img = Image.open('example.jpg')    # 1. 应用滤镜 (Filters)    # 比如模糊滤镜    blurred_img = img.filter(ImageFilter.BLUR)    blurred_img.save('example_blurred.jpg')    print("图片已应用模糊滤镜并保存为 example_blurred.jpg")    # 更多滤镜:SHARPEN, CONTOUR, EMBOSS, FIND_EDGES等    # sharpened_img = img.filter(ImageFilter.SHARPEN)    # sharpened_img.save('example_sharpened.jpg')    # 2. 颜色调整 (Color Enhancement)    # 调整亮度、对比度、色彩饱和度、锐度    enhancer = ImageEnhance.Brightness(img)    bright_img = enhancer.enhance(1.5) # 亮度增加50%    bright_img.save('example_bright.jpg')    print("图片亮度已调整并保存为 example_bright.jpg")    enhancer = ImageEnhance.Contrast(img)    contrast_img = enhancer.enhance(1.8) # 对比度增加80%    contrast_img.save('example_contrast.jpg')    print("图片对比度已调整并保存为 example_contrast.jpg")    # 3. 添加文字水印 (Text Watermark)    # 确保图片是RGB模式,如果不是,需要转换,因为Draw只支持RGB或RGBA    if img.mode != 'RGB':        img = img.convert('RGB')    draw = ImageDraw.Draw(img)    text = "Python & Pillow"    font_size = 30    # 尝试加载一个字体文件,如果系统没有这个字体,可能需要指定路径    try:        font = ImageFont.truetype("arial.ttf", font_size) # Windows系统常见字体    except IOError:        # 如果arial.ttf找不到,使用Pillow的默认字体        font = ImageFont.load_default()        print("警告: arial.ttf 未找到,使用默认字体。")    # 计算文字位置,比如右下角    text_width, text_height = draw.textsize(text, font=font) # draw.textsize 在Pillow 9.0+ 废弃,推荐使用 font.getbbox()    # 推荐的计算方式(Pillow 9.0+)    # bbox = font.getbbox(text)    # text_width = bbox[2] - bbox[0]    # text_height = bbox[3] - bbox[1]    x = img.width - text_width - 10 # 距离右边缘10像素    y = img.height - text_height - 10 # 距离下边缘10像素    draw.text((x, y), text, font=font, fill=(255, 255, 255, 128)) # 白色半透明文字    img.save('example_watermarked.jpg')    print("图片已添加文字水印并保存为 example_watermarked.jpg")except FileNotFoundError:    print("错误:example.jpg 文件未找到。")except Exception as e:    print(f"处理图片时发生错误: {e}")

在给图片添加文字水印时,

ImageDraw

模块是你的好帮手。它允许你在图像上绘制各种图形和文字。加载字体文件

ImageFont.truetype

是一个常见操作,但要注意字体文件的路径问题,不同操作系统可能有所不同。如果找不到指定字体,Pillow会退而求其次使用默认字体,这虽然保证了程序不会崩溃,但视觉效果可能不尽如人意。

fill

参数不仅可以设置颜色,还可以通过传递一个四元组

(R, G, B, A)

来设置透明度,这在制作半透明水印时非常实用。这些细致的控制,让Pillow在处理图像时显得异常灵活和强大。

以上就是如何用Python操作图像(PIL/Pillow库)?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1369876.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何实现二叉树的遍历?
上一篇 2025年12月14日 10:02:33
Python中的模块和包有什么区别?
下一篇 2025年12月14日 10:02:46

相关推荐

  • Laravel vs Node.js(Express/NestJS):后端技术选型对比

    laravel 和 node.js 各有优劣,具体选择取决于项目需求和团队技能。1. laravel 适用于需要快速开发和丰富功能的项目,提供优雅的语法和强大的生态系统。2. node.js 适合高并发和实时功能的项目,性能优越且使用 javascript 便于开发。 引言 在后端开发的世界里,选择…

    2026年8月28日
    500
  • VSCode怎么写JAVA项目_VSCode创建与开发Java项目完整教程

    答案是:配置VSCode写Java需三步——装JDK、配环境变量、装Java扩展包;创建项目用命令面板选Maven/Gradle;通过设置JDK路径、代码格式化、调内存提升效率;常见问题如语言服务器失败可清缓存或重启解决;依赖管理靠pom.xml或build.gradle,VSCode侧边栏提供Ma…

    2026年8月28日
    000
  • win10CPU高导致更新失败怎么办?

    win10CPU高导致更新失败怎么办?win10CPU高导致更新失败怎么办?win10CPU高导致更新失败怎么办?win10CPU高导致更新失败怎么办?

    电脑的cpu使用率偏高是较为常见的现象,特别是在系统更新时,cpu占用率往往会显著上升,这可能导致更新过程失败。对于windows 10用户来说,当cpu占用过高致使更新失败时,该如何处理呢?以下是几种解决这一问题的方法。 Windows 10 CPU占用过高导致更新失败的解决方案: 方法一: 按下…

    2026年8月28日 用户投稿
    000
  • Win10的下一次更新代号为“Manganese”

    2019年2月,微软开启了Windows 10 20H1功能更新的测试阶段,预计正式推送时间定在2020年5月。近期,微软提前发布了20H1更新的预览版本,原因是公司正在调整Azure和Windows工程部门的工作节奏。Windows 10的2020年5月更新基于一个全新平台,其内部代号为 &#82…

    2026年8月28日
    000
  • MySQL索引原理与实战优化_提升查询性能的关键技术解析

    MySQL索引原理与实战优化_提升查询性能的关键技术解析MySQL索引原理与实战优化_提升查询性能的关键技术解析MySQL索引原理与实战优化_提升查询性能的关键技术解析MySQL索引原理与实战优化_提升查询性能的关键技术解析

    mysql索引类型包括b-tree、哈希、全文索引等,适用于不同查询场景。1.b-tree索引以树状结构存储数据,适合范围查询和排序;2.哈希索引适用于等值查询,但不支持范围查询;3.全文索引用于文本搜索。选择索引需考虑查询需求、数据类型及维护成本。索引失效常见原因包括使用函数、表达式、or条件不当…

    2026年8月28日 用户投稿
    100
  • 怎样在 Workerman 中集成 Redis,实现缓存与消息队列功能?

    在 workerman 中集成 redis 可以实现缓存和消息队列功能。1) 通过 php 的 redis 扩展建立连接。2) 使用 redis 作为缓存层,减少数据库查询次数。3) 利用 redis 实现消息队列,处理异步任务,提升系统并发能力。 引言 Workerman 作为一个高性能的 PHP…

    2026年8月28日
    000
  • win10系统窗口边框消失_win10界面显示异常的修复技巧

    win10系统窗口边框消失_win10界面显示异常的修复技巧win10系统窗口边框消失_win10界面显示异常的修复技巧win10系统窗口边框消失_win10界面显示异常的修复技巧win10系统窗口边框消失_win10界面显示异常的修复技巧

    窗口边框消失可通过更新驱动、检查个性化设置、修复系统文件等方法解决。①更新或回滚显卡驱动:进入设备管理器,右键显卡选择更新或回滚驱动;②检查个性化设置:确保“标题栏和窗口边框”选项已勾选,尝试关闭透明效果;③运行sfc /scannow命令修复系统文件;④修改注册表:确认colorprevalenc…

    2026年8月28日 用户投稿
    200
  • 内网横向移动:Kerberos认证与(哈希)票据传递攻击

    在上一节《内网横向移动:获取域内单机密码与hash》中,我们探讨了如何在内网渗透中获取主机的密码和哈希值。获取哈希后,我们可以尝试破解,如果破解失败,我们可以利用这些哈希通过pth、ptt等攻击方式继续进行内网的横向渗透,这就是我们接下来要讨论的内容。 本节,我们将详细讲解横向渗透中的Kerbero…

    2026年8月28日
    000
  • Epic已免费赠送超500款游戏 你领取了多少款?

    epic games于2018年12月正式上线epic游戏商城,并自此开始持续为玩家提供免费游戏。几乎每星期都有新的免费游戏开放领取,涵盖多种类型,从休闲小游戏到如《给他爱5》这样的热门大作均有涉及。 最近,Reddit论坛用户antonio_mas发布了一项统计结果:自2018年首次送出免费游戏《…

    2026年8月28日
    000
  • EyeCare护眼工具怎么处理软件冲突_EyeCare护眼工具软件冲突处理步骤详解

    首先关闭冲突软件并调整启动项,通过禁用非必要色彩管理软件的自启动避免资源抢占;接着修改软件默认配置,统一色温标准为sRGB以实现兼容;若问题仍存,则进入安全模式彻底卸载冲突程序,确保EyeCare护眼工具稳定运行。 如果您在使用EyeCare护眼工具时遇到屏幕色阶频繁变化、功能失效或与其他色彩管理软…

    2026年8月28日
    100
  • kernel32.dll下载与安装指南 快速解决DLL缺失问题

    kernel32.dll下载与安装指南 快速解决DLL缺失问题kernel32.dll下载与安装指南 快速解决DLL缺失问题kernel32.dll下载与安装指南 快速解决DLL缺失问题kernel32.dll下载与安装指南 快速解决DLL缺失问题

    在使用windows操作系统时,有些用户可能会碰到程序启动时报错“无法找到kernel32.dll”或提示“kernel32.dll文件丢失”的问题。这类错误通常由系统文件损坏、病毒入侵或软件之间的冲突引起。下面为大家整理了几种有效的修复方法,一起来看看如何解决! 方法1:利用系统内置工具进行修复 …

    2026年8月28日 用户投稿
    000
  • 电脑如何截屏截长图

    通过截长图的方式,我们能够轻松地将整个网页的内容完整地保存下来,而无需手动拼接多张图片。只需简单几步,就能让电脑自动完成长截图的过程。接下来就跟着小编一起学习如何操作吧! 1、利用QQ截长图:首先打开电脑上的QQ客户端,按下组合键【Ctrl+Alt+A】激活截图工具。然后用鼠标框选出想要截取的部分,…

    2026年8月28日
    200
  • 怎么清理注册表 注册表清理教程

    怎么清理注册表 注册表清理教程怎么清理注册表 注册表清理教程怎么清理注册表 注册表清理教程怎么清理注册表 注册表清理教程

    电脑注册表存储着操作系统及各类软件的重要配置数据。随着使用时间增长,注册表中会不断积累无效条目、错误信息和冗余内容,这不仅可能拖慢系统运行速度,还可能导致程序异常或系统不稳定。本文将为你详细介绍如何安全高效地清理注册表,让你轻松完成系统优化。 一、注册表清理的意义 定期清理注册表对维护系统健康具有重…

    2026年8月28日 用户投稿
    300
  • Bing聊天更新:图像识别功能正式上线,提供智能解读!

    微软的Bing聊天即将迎来一次重要升级,在桌面端新增了一项令人兴奋的图像识别功能,这将彻底革新我们与图片交互的方式。此功能融入了OpenAI的ChatGPT-4视觉模型,具备精准识别并解析图像内容的能力,并且会通过丰富的示例为我们详细阐述。 当前,微软正面向全球部分用户试行Bing聊天的视觉功能。完…

    2026年8月28日
    100
  • Workerman 服务器 CPU 使用率过高,怎么进行性能调优?

    要降低 workerman 服务器的 cpu 使用率,可以采取以下措施:1. 简化业务逻辑,减少不必要的计算和 i/o 操作。2. 使用异步处理,将耗时任务放到异步队列中。3. 实施缓存机制,减少数据库查询次数。4. 配置负载均衡,避免单台服务器过载。通过这些方法,可以有效降低 cpu 使用率,提升…

    2026年8月28日
    100
  • 内存条接触不良导致的电脑死机蓝屏故障排查步骤

    内存条接触不良导致的电脑死机蓝屏故障排查步骤内存条接触不良导致的电脑死机蓝屏故障排查步骤内存条接触不良导致的电脑死机蓝屏故障排查步骤内存条接触不良导致的电脑死机蓝屏故障排查步骤

    内存条接触不良会导致蓝屏死机,是因为数据传输不稳定触发系统保护机制;解决步骤为:1.断电并打开机箱侧盖;2.取下内存条并清洁金手指和插槽;3.重新安装内存条并逐一测试;4.尝试更换插槽位置;5.使用memtest86检测硬件错误。其他常见蓝屏原因包括驱动问题、硬盘故障、过热、系统文件损坏及电源不稳定…

    2026年8月28日 用户投稿
    300
  • Yii2 实现邮件发送功能的详细步骤

    在 yii2 中实现邮件发送功能需要以下步骤:1. 在配置文件中设置 mailer 组件,2. 使用 yii::$app->mailer->compose() 方法发送邮件。yii2 通过 yiiswiftmailermailer 类和 swift mailer 库简化了邮件发送过程,支…

    2026年8月28日
    000
  • Spring Boot集成MyBatis时,yml配置正确却找不到Mapper接口怎么办?

    Spring Boot整合MyBatis:Mapper接口扫描配置详解及疑难解答 在使用Spring Boot集成MyBatis时,一个常见问题是:yml配置文件明明正确配置了MyBatis,却仍然报错找不到对应的Mapper接口。本文将深入分析此问题,并提供有效的解决方法。 问题描述: 许多开发者…

    2026年8月28日
    000
  • win7电脑开机出现BOOTMGR is compressed错误

    win7电脑开机出现BOOTMGR is compressed错误win7电脑开机出现BOOTMGR is compressed错误win7电脑开机出现BOOTMGR is compressed错误win7电脑开机出现BOOTMGR is compressed错误

    windows 7出现“bootmgr is compressed”错误时,需通过windows pe系统取消bootmgr文件的压缩或重建启动项。1.使用pe系统启动并找到系统盘;2.取消bootmgr文件的压缩属性;3.若无效则用启动修复工具(如ntbootautofix)修复启动项;4.仍无效…

    2026年8月28日 用户投稿
    200
  • [UWP]推荐一款很Fluent Design的bilibili UWP客户端 : 哔哩

    [UWP]推荐一款很Fluent Design的bilibili UWP客户端 : 哔哩[UWP]推荐一款很Fluent Design的bilibili UWP客户端 : 哔哩[UWP]推荐一款很Fluent Design的bilibili UWP客户端 : 哔哩[UWP]推荐一款很Fluent Design的bilibili UWP客户端 : 哔哩

    最近,uwp平台上又多了一个新的bilibili客户端: 哔哩 – Microsoft Store 开发者云之幻是一位在UWP设计领域颇有建树的开发者,我从他那里学到了许多设计技巧。他同时也是Bilibili的Up主,主要分享PowerPoint和UWP相关的教学内容。 云之幻的个人空间…

    2026年8月28日 用户投稿
    200

发表回复

登录后才能评论
关注微信