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第三方模块进行图片处理的相关方法。