PIL库是专门用来处理图像的第三方库,可以对图像进行像素、色彩的操作还可以对图像进行归档和批量处理。
这个第三方库也需要我们手动安装,安装的时候在搜索栏中搜索pillow即可安装。
根据功能的不同,PIL库共包含21个与图片相关的类,可以把这些类看作是PIL库的子库,这些子库如下:
Image、ImageChops、ImageColor、ImageCrackCode、ImageDraw、Image Enhance、ImageFile、ImageFileIO、ImageFilter、Image Font、ImageGL、ImageGrab、Imagemath、ImageOps、ImagePalette、ImagePath、ImageQt、ImageSequence、ImageStat、ImageTk、ImageWin
如果想了解更多关于PIL库的知识可以从以下网站获取
http://effbot.org/imagingbook/
我们先来康康Image类叭,它代表一张图片,我们可以通过
from PIL import Image
引入这个类。和我们的date类一样,我们首先需要几个方法创建出image类型的对象,然后针对这个对象python为我们提供几个属性。
那我们先来看一看Image类的图像读取和创建方法叭:
❶Image.open(filename)
根据参数加载图像文件
❷Image.new(mode, size, color)
根据给定参数创建一个新的图像
❸Image. open(StringlO.StringlO(buffer))
从字符串中获取图像
❹Image.frombytes(mode, size, data)
根据像素点data创建图像
前四个方法都可以创建出一个Image对象
程序只会读取图像文件头部的元数据信息,因此打开一个文件会十分迅速,与图像的存储和压缩方式无关。创建一个Image对象最简单的方法就是采用open函数。
Image对象的属性
创建好对现以后,我们就可以使用对象的属性了,下面来了解一下对象的属性都有哪些叭:
❶Image.format
标识图像格式或来源,如果图像不是从文件读取,值为None
❷Image.mode
图像的色彩模式,L为灰度图像、RGB"为真彩色图像、"CMYK"为
出版图像
❸Image.size
图像宽度和高度,单位是像素(px),返回值是二元元组(tuple)
❹Image.palette
调色板属性,返回一个ImagePalette类型
ps:这里简单说一下CMYK色彩:
CMYK是彩色印刷时采用的一套色彩体系,C是青色,M是品红色,Y是黄色,K是黑色。
from PIL import Image
#创建一个Image对象
im=Image.open("D:\pythonDemo\pyDemo3.jpg")
print("已创建的image对象的信息为\n图像格式为:{},图像宽高为:{},图像颜色模式为:{}".format(im.format,im.size,im.mode))
这里使用了Image的属性用于查看已读取图像的各项属性。
但是我们常见的图像并不都是静态的,我们见过动态的GIF、FLI、FLC、TIFF等类型,那么我们之前举的例子都是处理静态图像,对于动态图像要怎么处理呢?
image对象的处理方法
我们需要知道动态图像是由许多帧静态图像构成的,那我如果想要处理动态图像那我把它的每一帧都读取出来不就可以当作静态图像处理了吗?
于是Image为我们提供了图像序列操作方法:
①image.seek(frame)
跳转并返回图像中的指定帧。
②image.tell()
返回当前帧的序号。
Image类图像的转换和保存方法:
①image.save(filename, format)
将图像保存为flename文件名,format是图片格式
②Image.thumbnail(size)
创建图像的缩略图,size 是缩略图尺寸的二元元组
③Image.convert(mode)
使用不同的参数,转换图像为新的模式
其中save方法有两个参数文件名和图像格式,如果调用时不指定保存格式将自动根据文件名重点后缀格式存储图像。如果指定存储格式将按照指定格式存储。
因此我们如果想要转换图片的格式可以采用open()和save()方法来实现。
那我们下面来看一个GIF文件提取的例子叭:
from PIL import Image
#创建一个Image对象
im=Image.open("D:\pythonDemo\pyDemo4.gif")
#采用当前帧的序号为储存的文件命名
im.save('D:\pythonDemo\ImageDemo{}.png'.format(im.tell()))
try:
while True:
#使当前帧往后移,得到后续的静态图片
im.seek(im.tell()+1)
im.save("D:\pythonDemo\ImageDemo{}.png".format(im.tell()))
except:
print("处理结束")
至于这里为啥要使用try—catch语句呢?
注意这里的try和except还挺关键的哟,那这里为什么要使用try和except呢?
因为我们使用了while True这样的无限循环,我们结束提取的条件是已经是最后一帧了,再往后提取就没有帧了,此时因为后续没有帧了,你继续提取的话会出错,此时这个错误就会由except后面的语句处理,当我们发生错误时即已经提取完毕,这时候就可以利用except的处理机制离开循环执行except后面的语句。学废了吗
给大家康康我的执行结果:
这是我的gjf文件
from PIL import Image
#创建一个Image对象
im=Image.open("D:\pythonDemo\ImageDemo4.png")
im.thumbnail((100,100))
im.save("D:\pythonDemo\pyDemo5.png")
image图像的缩放和旋转
前面学习了Image类对图像格式的的转换和保存其实我们的Image类还可以用来对图像进行旋转和缩放哦:
大家在使用的时候一定要记住方法和函数是不一样的,函数可以通过类调用,方法只能通过类构造出对象,使用具体的对象调用方法。别问我为啥要提醒你,问就是我在举例子的时候就迷了,然后就疯狂报错[哭了]
Image.resize(size)
按照size大小调整图像,生成副本
Image.rotate(angle)
按照angle角度旋转图像,生成副本
from PIL import Image
#创建一个Image对象
im=Image.open("D:\pythonDemo\ImageDemo4.png")
om=im.resize((100,100))
om.save("D:\pythonDemo\pyDemo7.png")
oom=im.rotate(180)
om.save("D:\pythonDemo\pyDemo8.png")
结果的话大家自己动动小手试试叭,不放图了,我们对流量党好一点。
Image像素与通道处理方法
①Image.point(func)
根据函数func的功能对每个元素进行运算,返回图像副本
②Image.split()
提取RGB图像的每个颜色通道,返回图像副本
③Image.merge()
合并通道,mode表示色彩,bands表示新的色彩通道
④Image.blend(im1,im2,alpha)
将两图片im1和im2按照如下公式插值后生成新的图像:im1*(1.0-alpha)+im2*alpha
下面来看个例子:
from PIL import Image
im=Image.open("D:\pythonDemo\pyDemo3.jpg")
r,g,b=im.split()
om=Image.merge("RGB",(g,b,r))
om.save("D:\pythonDemo\pyDemo10.jpg")
可以看到原图片是pyDemo3,生成的图片是pyDemo10,可以看到我可爱的白熊的颜色发生了变化
如果要对像素点进行操作的话需要通过函数实现可以采用lambda函数和point方法
这是一个示例代码:
为什么说python比较简单比较容易上手呢?因为它的语法很简洁,而且功能强大,它强大的功能主要来源于丰富的第三方库。
好了,下面我们介绍有关图像的过滤和增强的子库,下次见咯