一、 安装
参考文档:https://pillow.readthedocs.io/en/latest/installation.html
Pillow
的安装比较的简单,直接pip安装即可:
pip install Pillow
但是要注意的一点是,Pillow
和PIL
不能共存在同一个环境中,所以如果安装的有PIL
的话,那么安装Pillow
之前应该删除PIL
。
由于是继承自PIL
的分支,所以Pillow
的导入是这样的:
import PIL
# 或者
from PIL import Image
注意:图像处理库PIL
(Python Imaging Library )支持python2,不支持python3。
二、使用手册
1、Image类的使用
Image
是Pillow中最为重要的类,实现了Pillow中大部分的功能。要创建这个类的实例主要有三个方式:
- 从文件加载图像
- 处理其他图像获得
- 创建一个新的图像
(1) 读取图像
一般来说,我们都是都过从文件加载图像来实例化这个类,如下所示:
from PIL import Image
picture = Image.open('happy.png')
如果没有指定图片格式的话,那么Pillow
会自动识别文件内容为文件格式。
(2)新建图像
Pillow
新建空白图像使用new()
方法, 第一个参数是mode即颜色空间模式,第二个参数指定了图像的分辨率(宽x高),第三个参数是颜色。
- 可以直接填入常用颜色的名称。如'red'。
- 也可以填入十六进制表示的颜色,如
#FF0000
表示红色。 - 还能传入元组,比如(255, 0, 0, 255)或者(255, 0, 0)表示红色。
picture = Image.new('RGB', (200, 100), 'red')
(3)保存图像
保存图片的话需要使用save()
方法:
picture.save('happy.png')
保存的时候,如果没有指定图片格式的话,那么Pillow
会根据输入的后缀名决定保存的文件格式。
2、图像的坐标表示
在Pillow中,用的是图像的左上角为坐标的原点(0,0),所以这意味着,x轴的数值是从左到右增长的,y轴的数值是从上到下增长的。
我们处理图像时,常常需要去表示一个矩形的图像区域。Pillow
中很多方法都需要传入一个表示矩形区域的元组参数。
这个元组参数包含四个值,分别代表矩形四条边的距离X轴或者Y轴的距离。顺序是(左,顶,右,底)
。其实就相当于,矩形的左上顶点坐标为(左,顶)
,矩形的右下顶点坐标为(右,底)
,两个顶点就可以确定一个矩形的位置。
右和底坐标稍微特殊,跟python列表索引规则一样,是左闭右开的。可以理解为[左, 右)
和[顶, 底)
这样左闭右开的区间。比如(3, 2, 8, 9)就表示了横坐标范围[3, 7];纵坐标范围[2, 8]的矩形区域。
(1) 常用属性
-
PIL.Image.filename
图像源文件的文件名或者路径,只有使用
open()
方法创建的对象有这个属性。类型:字符串
-
PIL.Image.format
图像源文件的文件格式。
-
PIL.Image.mode
图像的模式,一般来说是“1”, “L”, “RGB”, 或者“CMYK” 。
-
PIL.Image.size
图像的大小
-
PIL.Image.width
图像的宽度
-
PIL.Image.height
图像的高度
-
PIL.Image.info
图像的一些信息,为字典格式
(2)常用方法
-
裁剪图片
Image
使用crop()
方法来裁剪图像,此方法需要传入一个矩形元祖参数,返回一个新的Image
对象,对原图没有影响。
croped_im = im.crop((100, 100, 200, 200))
注意:图片在计算机中是一个矩阵形式存在
-
复制与粘贴图像
复制图像使用copy()
方法:
copyed_im = im.copy()
粘贴图像使用paste()
方法:
croped_im = im.crop((100, 100, 200, 200))
im.paste(croped_im, (0, 0))
im对象调用了paste()
方法,第一个参数是被裁剪下来用来粘贴的图像,第二个参数是一个位置参数元祖,这个位置参数是粘贴的图像的左顶点。
-
调整图像的大小
调整图像大小使用resize()
方法:
resized_im = im.resize((width, height))
resize()
方法会返回一个重设了大小的Image
对象。
或者使用thumbnail()方法
im = Image.open('test.jpg')
#获得图像尺寸
w, h = im.size
# 缩放到50%
im.htumbnail((w//2, h//2))
#显示图片
im.show()
thumbnail()
方法可以用来制作缩略图。它接受一个二元数组作为缩略图的尺寸,然后将示例缩小到指定尺寸
-
旋转图像和翻转图像
旋转图像使用rotate()
方法,此方法按逆时针旋转,并返回一个新的Image
对象:
# 逆时针旋转90度
im.rotate(90)
im.rotate(180)
im.rotate(20, expand=True)
旋转的时候,会将图片超出边界的边角裁剪掉。如果加入expand=True
参数,就可以将图片边角保存住。
翻转图像使用transpose()
:
# 水平翻转
im.transpose(Image.FLIP_LEFT_RIGHT)
# 垂直翻转
im.transpose(Image.FLIP_TOP_BOTTOM)
-
获得图片通道名称
im.getbands()
-
通过通道分割图片
(1) split()
split()
可以将多通道图片按通道分割为单通道图片。返回各个通道的灰度图组成的元组
R, G, B = im.split()
split()
方法返回的是一个元祖,元祖中的元素则是分割后的单个通道的图片。
(2)getchannel(channel)
getchannel()
可以获取单个通道的图片:
R = im.getchannel("R")
-
模式转化
img = im.convert("L") #转为灰度
-
获取单个像素的值
使用getpixel
(xy)方法可以获取单个像素位置的值:
im.getpixel((100, 100))
传入的xy需要是一个元祖形式的坐标。
如果图片是多通道的,那么返回的是一个元祖。
-
加载图片全部数据
我们可以使用load()
方法加载图片所有的数据,并比较方便的修改像素的值:
pixdata = im.load()
pixdata[100,200] = 255
此方法返回的是一个PIL.PyAccess
,可以通过这个类的索引来对指定坐标的像素点进行修改。
-
获取全部像素内容
getdata(band = None)
方法,用来获取 Image
类的对象中的像素内容
该方法会将图片中的像素内容,逐行逐行地拼接起来,作为一个完整的序列返回。方法的返回类型,是 PIL 库的内部类型。我们可以用 list(im.getdata())
得到标准的 Python list
对象。
band
意味「通道」。当 band = None
时,方法返回所有通道的像素内容;当 band = 0
时,则返回第一个通道的像素内容。例如,对于 RGB 模式的位图,band = 0
返回 R 通道的内容;band = 2
返回 B
通道的内容。
from PIL import Image
im = Image.open('test.jpg')
print(im.getdata()) #获取所有通道的值 类似生成器的对象
print(list(im.getdata(0))) #获取第一个通道的值, 转化为列表
-
关闭图片并释放内存
此方法会删除图片对象并释放内存
im.close()