python自学之《21天学通Python》(16)——第19章 用Pillow库处理图片
Pillow是Python2.X时代比较流行的Python ImagingLibrary(简称Pillow)图像处理库的分支,并修复了一些bug。Pillow提供了对Python3的支持,为Python3解释器提供了图像处理的功能。和Pillow库一样提供了广泛的文件格式支持、高效的内部表示以及相当强大的图像处理功能。这个图像处理库的核心被设计成为能够快速访问几种基本像素类型表示的图像数据。它为通用图像处理工具提供了一个坚实基础,通过使用Pillow模块,可以使用Python3对图片进行处理,例如,可用来对图片进行尺寸、格式、色彩、旋转等处理。
19.1 第三方Pillow库概述
由于Pillow不是Python自带的模块,因此需要用户自己安装。Pillow是跨平台的,在各种系统下都可以使用Pillow的强大功能。
19.1.1 安装第三方Pillow库
与安装Python的其他第三方库的方法相同,可以到以下网址下载库的压缩包。
https://pypi.python.org/pypi/Pillow/2.7.0
https://github.com/python-Pillow/Pillow
解压后,在命令提示符下进入其目录,运行以下命令:
python setup.py install
如果你的计算机可以联网的话,直接运行以下命令就自动可以从互联网上下载安装:
pip install pillow
19.1.2 Pillow库简介
在Pillow中,主要提供了以下对图片进行处理的模块。利用这些模块可以装载和保存多种格式文件,对图像进行缩放、裁剪、合成与变换,也可以像Photoshop一样专门处理通道,支持像素级操作、滤镜,支持对图像进行对比增强和统计分析,支持绘制文字和基本图形,甚至还支持动画。它包括的主要模块如表19.1所示。
19.1.3 Pillow库处理图像基础
Pillow库对图像的操作牵涉到图像处理的相关概念及表示,如下:
pixes(像素)——构成图片的点单元;
size(尺寸)——图片的大小,以两个元素的元组构成,形式为水平像素数,垂直像素数;
coordinates(坐标)——以左上角为(0,0)的坐标系统,形式为(x,y);
angles(角度)——以x轴正方向为起点,逆时针为正,反之为负,其单位为度(degree);
bboxes(边界框)——用来表示一个图像区域,形式为(x0,y0,xl,yl),是以左上角点坐标(x0,y0)为起点至右正下角bands(通道)——独立的颜色通道,它们具有相同的维数和深度。如在RGB模式下,每个图片由三个通道(RGB)叠加而成;(xl, yl)为终点,但不包含xl在列和yl所在行的区域;
mode(模式)——各种图片模式,如表19.2所示。
表19.2 Pillow支持图片模式及字符串表示
color(颜色)——可以为32位数值、元组或字符串。对于以上不同的图像格式,单通道图像像素值为1位、8位、32位等整数类型值;多通道图像则用像素元组来表示即(r,g,b)。此外,还可以使用以下风格的字符串型表示颜色:
CSS #FF0000或#F00;
RGB rgb(255,0,0或rgb(100%,0,0);
HSL hsl(120,30%,78%)。
filters——滤镜,多个像素映射到一个像素,以改变图像尺寸。目前主要有以下几种:
NEAREST 最近;BILINEAR 双线性;BICUBIC 双二次;ANTIALIAS 平滑。
fonts(字体)——可以支持bitmap、OpenType、TrueType等类型。
format(格式)——文件格式,默认以文件名的扩展名指定,也可以单独指定。如“PNG”、“JPG”等。
注意: 以上各种概念如图片模式等在图片处理中很重要,要熟练处理图片,必须了解这些基础知识。
19.1.4 Image模块中函数的使用
对于简单的图片处理,一般仅需使用Image模块,这个模块中包含的主要函数和使用方法如下:
open(file, mode)其参数含义如下:
file 要打开的图片文件;
mode 可选参数,打开文件的方式,一般使用默认值r即可。
Image模块中主要的函数是open函数,用于打开图片,操作结果是返回Image类的实例。当文件不存在时,会引发IOError错误。
new(mode, size, color=0)其参数含义如下;
mode 图片模式,如表19.2所示;
size 图片尺寸,宽、高构成的元组;
color 默认颜色(黑)。
blend(iml, im2, alpha)其参数含义如下:
iml 参与混合的图片1;
im2 参与混合的图片2;
alpha 混合透明度[0—1]。
实现的功能是将iml、im2两幅图片(尺寸相同)以一定的透明度混合,混合的方法是:
(im1 × (1 - alpha) + im2 × alpha)
当alpha为0时,得到iml原图片,为1时,得到im2原图片。
【实例19-1】 演示了用blend()函数混合图像的实例,代码如下:
【代码说明】代码仅有四行,但实现了两张图片以一定的透明度混合,并且混合后调用系统中的软件显示相应的图片。
【运行效果】将此两幅图片混合后得到如图19.1所示。
注意: 原始图片a.jpg、b.jpg分别如图19.2、图19.3所示。
composite(iml, im2, mask)其参数含义如下:
im1 参与混合的图片1;
im2 参与混合的图片2;
mask 混合遮罩。
其功能是使用mask来混合im1和im2,并且要求它们尺寸相同,作为mask的图片模式可以是“1”、“L”、“RGBA”。
【实例19-2】 演示了用blend()函数中的遮罩功能混合图像的实例,代码如下:
eval(image, fun)其参数含义如下。
im1输入的图片;
fun 给输入图片的每个像素应用此函数。
其功能是将输入图片的每个像素应用函数fun进行计算后返回,fun函数只允许接收一个整数类型参数。如果一个图片含有多个通道,则每个通道都会应用这个函数。
【实例19-3】 演示了使用eval()函数对图片进行处理的实例,代码如下:
merge(mode, bands)其参数含义如下。
mode 输出文件的模式;
bands用于合成图片的所有通道列表、元组等序列。
其功能是将多个图形通道合成一幅图像,并返回该合成图像实例。
19.1.5 Image模块中Image类的使用
上一节打开图片文件返回和引用图像的变量,实际上是Image模块中Image类对象的实例,运用该对象的方法可以访问图片的属性和对图片进行变换操作。Image类具有许多有用的方法和属性如下:
主要属性有:
Image.format 源图像格式;
Image.mode 图像模式字符串;
Image.size 图像尺寸。
主要方法有:
Image.convert(mode=None, matrix=None, dither=None, palette=0, colors=25
其主要参数含义如下:
mode 转换文件为此模式;
matrix 转换使用的矩阵(4或16元素的浮点数元组);
dither None时且转为黑白图时非0(1~255)像素均为白,也可以设置为此参数FLOYDSTEINBERG。
其功能是返回模式转换后的图像实例,目前支持的模式有“L”、“RGB”、“CMYK”,matrix参数只支持“L”、“RGB”。
注意: 非原地修改,函数的返回值为修改后的图像。
彩色图片轮换为“L”模式时,应用以下公式进行转换:
L = R * 299/1000 + G * 587/1000 + B * 114/1000
此外,运用matrix参数可以转换出不同意想不到效果的图片。
Image.transpose(method)
变换图像后,返回变换的图像(非原地修改),方法有:
Image.paste(im, box=None, mask=None)
其参数的意义如下:im 源图或像素值;box 为粘贴区域;mask 为遮罩。
功能是粘贴源至该图像,box可以为以下三种情况:
(xl,yl)将源图像左上角对齐xl,yl点,其余超出被粘贴的图像的区域被抛弃;
(xl,yl,x2,y2)源图像与此区域必须一致;
None 源图像与被粘贴的图像大小必须一致。
其他一些简单的方法如下:
【实例19-4】 演示了Image模块的一些函数的使用,代码如下:
【代码说明】代码中首先导入Pillow库,然后用Image模块中的open()函数打开当前目录下的图像文件“a.jpg”,并返回图像的实例。之后分别应用Image模块中的函数和Image模块中Image类的方法处理它,并输出其对比图。
【运行效果】运行该实例代码后,控制台输出如图19.6所示,输出了图像文件中的“a.jpg”的图像格式、图像模式、图像尺寸和图像通道列表。其他处理后的图像输出如图19.7~19.16所示。
19.1.6 使用ImageChops模块进行图片合成
该模块包含多种用计算通道中像素值的方式来进行图片合成的函数,其主要用于制作特效、合成图片等。这个模块包含的图像处理的函数很多,这里仅举几个例子说明其用法,更详细的函数及其使用可以参考官方网站。
【实例19-5】 演示了用以上多个函数合成图片效果的例子,其代码如下:
【代码说明】代码很简单,先导入使用的模块后打开用来合成的两幅图像,之后调用ImageChops模块中的函数来合成图像。
【运行效果】运行后得到的图像如图19.17~19.23所示,而最后产生的图像为纯黑色,因为比较的是同一幅图像。
19.1.7 使用ImageEnhance模块增强图像效果
该模块中函数的主要作用是增强图像的效果,主要可以用来调整图像的色彩、对比度、亮度、清晰度等,感觉上和调整电视机的显示参数一样。其主要的函数如下:
【实例19-6】 演示了使用图像增强模块的实例,代码如下。
【代码说明】代码中首先导入所需的Pillow库,然后分别建立两种调整器(色彩、亮度),最后在两层循环中输出调整后的图像对比。
【运行效果】运行此代码输出的4幅图像,如图19.24~19.27所示。
19.1.8 使用ImageFilter模块的滤镜
ImageFilter模块提供了滤镜功能,它也可以被用来建立图像特效,或以此效果作为中间结果进一步处理。该模块中提供了一些预定义的和供自定义的过滤器。
预定义的近十个过滤器中主要有:
【实例19-7】 演示了应用以上几种滤镜生成的对比图的实例,代码如下:
【代码说明】代码中首先导入了相关的库,之后建立应用滤镜的列表,并用for遍历使用并输出其对比图。
【运行效果】运行以上代码得到的对比效果图如图19.28~19.30所示:
19.1.9 使用ImageDraw模块画图
ImageDraw模块提供了2D绘图功能,可以通过创建图片来绘图,也可以在原有的图片上进行绘图,以达到修饰图片或对图片进行注释的目的。
使用ImageDraw模块画图的基本步骤为:
【实例19-8】 演示了一个用ImageDraw模块绘制的图形的实例,代码如下:
19.2 使用Pillow库处理图片举例
Pillow提供了非常实用的函数,很多情况下仅需使用一两个Pillow函数或者方法,就可以完成对图片的处理,如调整图片大小,转换图片格式等。配合Python的灵活性,使用Pillow可以创建一些非常实用的图片处理程序。本节主要介绍使用Pillow结合tkinter库建立图形化批量图片处理工具。
【实例19-9】 演示了批量图片文件格式转换的GUI程序,代码如下:
【代码说明】代码的主要部分为自定义的一个主类,类的构造函数中生成GUI窗口组件,并在窗口中添加相应的GUI组件供用户选择使用,主类的Browser()方法用来选择转换的图片文件的目录,Corw()方法用来遍历当前目录中的所选类型的图片文件并转换保存。
【运行效果】程序运行后,将显示如图19.32所示窗口,单击“浏览”按钮选择一个保存源图片的目录,接着在下方选择从一种图片格式转换为另一种图片格,最后单击“转换”按钮,即可批量转换图片的格式。转换操作完成后,在指定目录下新建一个目录,用来保存转换后的图片。
19.2.2 批量生成缩略图
生成缩略图也是常用的图片处理方式之一,使用Pillow生成缩略图可以使用Image的resize函数,因为使用resize函数可以重新指定图片的大小。
【实例19-10】 演示了程序使用Pillow模块批量生成图片的缩略图,代码如下:
【代码说明】该程序的代码和实例19-9基本结构相同,这里不作解释了。
【运行效果】程序运行后将显示如图19.33所示的窗口,输入缩略图的百分比,接着选择一个文件或目录进行转换,单击“转换”按钮,即可为选择的图片或选择目录中所有的图片生成缩略图。生成的缩略图与原图保存同一个目录中,缩略图的文件名由原文件名加上“_thumb.jpg”组成。
19.2.3 为图片添加Logo
使用Pillow为图片添加Logo,主要使用Image的paste函数。paste函数可以向图片中粘贴其他的图片。
【实例19-11】 演示的程序代码,就是使用Pillow模块为图片批量添加Logo:
【代码说明】其代码结构与前例相同。
【运行效果】程序运行后,显示如图19.34所示的窗口,选择一个作为Logo的图片,接着选择需要添加Logo的图片,然后在窗口下方选择Logo添加的位置,最后单击“添加”按钮,即可将Logo图片添加到图片的指定位置。
19.3 小结
本章介绍了一个Python处理图片的第三方模块Pillow,Pillow模块的功能非常强大,可对图片进行各种操作。在本章中首先介绍了Pillow模块的下载和安装。然后介绍了Pillow模块的处理图像的基本概念、Image模块、ImageChops模块、ImageEnhance模块、magefilter模块等模块的基本使用方法。最后本章介绍了使用Pillow处理图片的几个案例:使用 Pillow转换图片格式、生成缩略图、为图片添加Logo。此外,Pillow模块中还包括其他一些模块,可以参考相关资料。通过学习本章,你应掌握使用Pillow第三方模块进行图片处理的相关方法。
19.4 本章习题
相关文章:

python自学之《21天学通Python》(16)——第19章 用Pillow库处理图片
Pillow是Python2.X时代比较流行的Python ImagingLibrary(简称Pillow)图像处理库的分支,并修复了一些bug。Pillow提供了对Python3的支持,为Python3解释器提供了图像处理的功能。和Pillow库一样提供了广泛的文件格式支持、高效的内部…...

发布依赖到maven仓库
maven中央仓库是一个开放的仓库,所以我们也可以把自己开发的jar推送到远程仓库,这样可以直接引入pom依赖使用我们的库。 准备工作 ● 需要一个github账号(程序员必备) ● 网络代理(涉及到的网站通常没版本在国内直接访…...

Laravel-admin之自定义操作日志
laravel-admin是封装性极好的框架,自带的就有操作日志的记录,但是对于非开发人员可能看不懂这个日志,所以就想着给修改一下,以谁修改了什么,谁删除了什么,谁审核了什么,谁添加了什么类似&#x…...

用Python做了一个法律查询小工具,非常好用
用Python做了一个法律查询小工具,非常好用效果展示准备工作不会的话可以点我直达代码和视频讲解,我都准备好了主要代码哈喽兄弟,今天给大家分享一个Python tkinter制作法律查询小工具。 光爬虫大家也只能自己用用,就算打包了exe&…...

工作篇:触摸屏原理介绍
一、触摸屏概述 触摸屏作为一种新的输入设备,它是目前最简单、方便、自然的一种人机交互方式。 当接触了屏幕上的图形按钮时,屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置,可用以取代机械式的按钮面板,并借由液晶…...

Ep_操作系统面试题-操作系统的分类
答案 单体系统 整个操作系统是以程序集合来编写的,链接在一块形成一个二进制可执行程序,这种系统称为单体系统。 分层系统 每一层都使用下面的层来执行其功能。 微内核 微内核架构的内核只保留最基本的能力,把一些应用放到了用户空间 客户-…...
iframe或document监听滚动事件不起作用
有时候我们会遇到监听iframe或document的滚动事件不起作用的情况,在排除代码写错的情况下,我们应该考虑此时的document是否可以滑动。 1、为什么document不能监听滑动? 就很奇怪,明明页面时有滚动条的,为什么说document不可滑动…...

基频估计算法简介
基频估计算法 F0 estimate methods 估计F0的方法可以分为三类:基于时域、基于频域、或混合方法。本文详细介绍了这些方法。 所有的算法都包含如下三个主要步骤: 1.预处理:滤波,加窗分帧等 2.搜寻:可能的基频值F0(候选…...

linux修改DNS 系统版本Kylin V10桌面版
配置DNS在银河麒麟桌面操作系统V10 SP1 中修改DNS信息,直接修改/etc/resolv.conf文件中的DNS信息,不能生效。应该参考如下步骤:一、首先修改 /etc/systemd/resolved.conf文件,在其中添加DNS信息在终端中执行以下命令:s…...
如何使用 AWS Lambda 运行 selenium
借助 AWS Lambda 运行 selenium 来爬取网络数据。 简介 与手动从网站收集数据相比,爬虫可以为我们节省很多时间,对于爬虫的每次请求而言,这相当于 AWS Lambda 的每次函数的运行。 AWS Lambda 是一种将脚本部署到云的简单且价格低廉的服务&…...

认识Cesium旋转大小变量
前文代码中有如下;矩阵乘以旋转大小,还放入mat; Cesium.Matrix4.multiply(mat, rotationX, mat); 初看以为rotationX是一个数值,因为矩阵可以和数相乘; 但是看它的代码,rotationX是由一长串代码获得的&a…...
异响加持、吐槽声不断,小鹏G9难解困局
小鹏汽车的烦恼就好比红尘中的三千青丝,小鹏G9“惊魂48小时”的恐慌还未平息,车门异响等问题就已经层出不穷,再次将小鹏汽车推上风口浪尖。 可以毫不客气的说,G9承载着小鹏汽车盈利的希望,但在原本处于上升之势的G9却…...

【react】react18的学习
一、安装 $ create-react-app [Project name]默认支持sass 二、核心依赖 react:react 核心 react-dom:用于开发渲染web 应用; react-scripts:封装webpack服务; "start": "react-scripts start&quo…...

Ep_操作系统面试题-什么是线程,线程和进程的区别
1. 一个进程中可以有多个线程,多个线程共享进程的堆和方法区 (JDK1.8 之后的元空间),但是每个线程有自己的程序计数器、虚拟机栈和 本地方法栈。 2.进程是资源分配的最小单位,线程是CPU调度的最小单位 视频讲解: https://edu.csdn.net/course/detail/38090 点我…...

最流行的自动化测试工具,总有一款适合你(附部分教程)
前言 在自动化测试领域,自动化工具的核心地位毋庸置疑。本文总结了最顶尖的自动化测试工具和框架,这些工具和框架可以帮助组织更好地定位自己,跟上软件测试的趋势。这份清单包含了开源和商业的自动化测试解决方案。 1)Selenium …...
Shell高级——进程替换vs管道
以下内容源于C语言中文网的学习与整理,如有侵权请告知删除。 1、问题引入 这里将Shell中的“进程替换”与“管道”放在一起讲,是因为两者的作用几乎类似。 进程替换:将一个命令的输出结果传递给另一个(组)命令。 管…...

国内有哪些支持定制化的低代码平台?
编者按:贴合企业业务需求的系统才是好系统,高程度的定制能力平台意味着可以提供更高契合度的产品,更好地匹配业务需求。本文介绍了国内支持定制化的老厂商低代码平台,具有源码交付、私有化部署、国产化、数据对接等优势。关键词&a…...

Altair 宣布将于3月举办 Future.Industry 2023 全球虚拟大会
Altair(纳斯达克股票代码:ALTR)近日宣布将于 2023 年 3 月 8 - 9 日 举办年度全球虚拟大会 Future.Industry 2023。旨在探索影响全球未来的新趋势,并深入探讨仿真、高性能计算 (HPC)、人工智能(AI)和数据分…...

react lazyLoad学习记录
react lazyLoad学习记录1.lazyLoad用处2.使用2.1 react-router-dom5版本写法2.2 react-router-dom6版本写法1.lazyLoad用处 默认例如首页,如果有好十几个甚至百个路由,react是会默认一下全部把路由组件一下全部加载的,极可能造成页面卡顿。r…...

29 openEuler管理网络-配置网络绑定
文章目录29 openEuler管理网络-配置网络绑定29.1 使用nmcli29.2 使用命令行29.2.1 检查是否已安装Bonding内核模块29.2.2 创建频道绑定接口29.2.3 创建从属接口29.2.4 激活频道绑定29.2.5 创建多个绑定29 openEuler管理网络-配置网络绑定 29.1 使用nmcli 创建名为bond0的绑定&…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...