Python Imaging Library,是Python的图像处理标准库,但只支持到2.7系列,因此,众多志愿者在PIL的基础上创建了兼容的版本,支持最新Python 3.x,又加入了许多新特性————Pillow。
Image 类是 PIL(Pillow) 库中一个非常重要的类,通过这个类来创建实例可以有直接载入图像文件,读取处理过的图像和通过抓取的方法得到的图像这三种方法。
from PIL import Image
打开并标识给定的图像文件。
实例化类方法:
实例化对象 = Image.open(‘图片.图片格式’)
from PIL import Image
im = Image.open('cat.jpg')
# 显示导入图片
im.show()
from PIL import Image
im = Image.open("cat.jpg")
im.rotate(90).show()
如果格式不指定图片格式,会自动识别文件内容格式
使用给定的模式和大小创建新图像。
实例化对象 = Image.new(模式,大小,颜色= 0 )
模式:用于设置新建图片模式参考位置(RGB、RGBA等)
大小:图像大小(长 X 宽)(分辨率)
颜色: 可以直接填入常用颜色名称
可以填入十六纸质标的的颜色(#FF0099)
可以传入元组,(255,255,255)
from PIL import Image
im = Image.new('RGB', (200, 100), 'red')
im.show()
save(‘保存名称.图片格式’)
im.save('picture.jpg')
保存的时候,如果没有指定图片格式的话,那么Pollow会根据输入的后缀名决定图片的格式。
Python Imaging Library使用笛卡尔像素坐标系,左上角有(0,0)。请注意,坐标指的是隐含的像素角; 寻址为(0,0)的像素的中心实际上位于(0.5,0.5)。
坐标通常作为2元组(x,y)传递给库。矩形表示为4元组,左上角首先给出。例如,覆盖所有800x600像素图像的矩形被写为(0,0,800,600)。
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
保存与图像相关的数据的字典。
类型:字典
from PIL import Image
im = Image.open('cat.jpg')
print(im.filename)
print(im.format)
print(im.mode)
print(im.size)
print(im.width)
print(im.height)
print(im.info)
cat.jpg
JPEG
RGB
(1280, 853)
1280
853
{'jfif': 257, 'jfif_version': (1, 1), 'dpi': (72, 72), 'jfif_unit': 1, 'jfif_density': (72, 72)}
Image.show(title = None,command = None )
显示此图像。此方法主要用于调试目的。
参数:
title - 用于图像窗口的可选标题。
command - 用于显示图像的命令
copy()
copy()方法复制图像
from PIL import Image
im = Image.open('cat.jpg')
copy_im = im.copy()
copy_im.show()
crop()
crop()方法用做裁剪图像,该方法需传入矩形元组参数,返回一个新的Image对象,对原图没有影响。
crop_im = im.crop((矩形参数))
from PIL import Image
im = Image.open('cat.jpg')
# 复制
copy_im = im.copy()
# 裁剪图片
crop_im = im.crop((420, 150, 860 , 560))
crop_im.show()
paste()
paste(用来粘贴的图片,(位置坐标))
可以通过设置位置坐标来确定粘贴图片的位置
注: 该方法没有返回值,直接作用于原图片
示例
from PIL import Image
im = Image.open('cat.jpg')
# 复制
copy_im = im.copy()
# 裁剪图片
crop_im = copy_im.crop((420, 150, 860 , 560))
# 粘贴图片
im.paste(crop_im, (0, 0)) # 左上角原点位置
im.show()
**resize()**方法会返回一个设定了大小的Image对象。
示例
resized_im = im.resize((width, height))
thumbnail()
thumbnail()方法可以用来制作缩略图,可接收二元数组作为缩略图的尺寸,然后将示例缩小到指定尺寸。
from PIL import Image
im = Image.open('cat.jpg')
#获得图像尺寸
w, h = im.size
# 缩放到50%
im.thumbnail((w//3, h//3))
#显示图片
im.show()
resize()与thumbnail()的区别,resize()会改变图片原比例,thumbnail()会根据width属性等比例缩放。
rotate()
此方法返回此图像的副本,围绕其中心逆时针旋转给定的度数。
from PIL import Image
im = Image.open('cat.jpg')
# 逆时针旋转30°
rotate_im = im.rotate(30)
rotate_im.show()
旋转的时候,会将图片超出边界的边角裁剪掉。
如果加入expand=True参数,就可以将图片边角保存住。
from PIL import Image
im = Image.open('cat.jpg')
rotate_im = im.rotate(30,expand = True)
rotate_im.show()
transpose()
移调图像(以90度为单位翻转或旋转)
参数:
Image.FLIP_LEFT_RIGHT 水平翻转
Image.FLIP_TOP_BOTTOM 垂直翻转
Image.ROTATE_90 旋转90度
Image.ROTATE_180 旋转180度
Image.ROTATE_270 旋转270度
Image.TRANSPOSE 水平翻转并旋转90度
Image.TRANSVERSE 水平翻转并旋转270度
from PIL import Image
im = Image.open('cat.jpg')
tran_im = im.transpose(Image.FLIP_LEFT_RIGHT)
tran_im.show()
getbands()
获取图片通道名称,返回元组
im.getbands()
split()
split()可以将多通道图片按通道分割为单通道图片。返回各个通道的灰度图组成的元组。
split()方法返回的是一个元祖,元祖中的元素则是分割后的单个通道的图片。
R, G, B = im.split()
代码示例
from PIL import Image
# 打开图片
im = Image.open('cat.jpg')
# 获取图片通道名称
get_im = im.getbands()
# 打印通道信息
print(get_im)
# 通过通道分割图片
R,G,B = im.split()
# 展示图片
R.show()
G.show()
B.show()
执行结果
('R', 'G', 'B')
getchannel(channel)可以获取单个通道的图片:
R = im.getchannel("R")
convert()
参数:
mode - 请求的模式。
matrix - 可选的转换矩阵。如果给定,则应该是包含浮点值的4或12元组。
抖动 - 抖动方法,在从“RGB”模式转换为“P”或从“RGB”或“L”转换为“1”时使用。可用方法为NONE或FLOYDSTEINBERG(默认值)。请注意,在提供矩阵时不使用此选项。
palette - 从“RGB”模式转换为“P”时使用的Palette。可用的调色板是WEB或ADAPTIVE。
colors - 用于自适应调色板的颜色数。默认为256。
返回值:图像的转换副本
img = im.convert("L")
使用getpixel(x,y)方法可以获取单个像素位置的值:
from PIL import Image
im = Image.open('cat.jpg')
print(im.getpixel((20,20)))
img = im.convert('L')
print(img.getpixel((20,20)))
传入x,y需要一个元组类型的坐标。
如果图像是多通道则返回一个元组
结果
(186, 123, 54)
133
注:L模式经常用来处理图像识别,数据方便分析处理
load()
为图像分配存储并加载像素数据。在正常情况下,您不需要调用此方法,因为Image类在第一次访问时会自动加载打开的图像。
但使用load()可以方便我们修改像素的值。
from PIL import Image
im = Image.open('cat.jpg')
pix = im.load()
print(pix [20,20])
pix [20,20] =255
print(pix)
im.show()
此方法返回的是一个PyAccess类,可以通过这个类的索引来对指定坐标的像素点进行修改。
getdata()
将此图像的内容作为包含像素值的序列对象返回。序列对象被展平,因此第一行的值紧跟在第0行的值之后,依此类推。
参数
band:通道,当 band = None 时,方法返回所有通道的像素内容;要返回单个波段,请传入索引值(例如0以从“RGB”图像获取"R"波段)
返回值:一个类序列的对象。
请注意,此方法返回的序列对象是内部PIL数据类型,仅支持某些序列操作。
要将其转换为普通序列(例如用于打印),请使用list(im.getdata())。
from PIL import Image
im = Image.open('cat.jpg')
# 获取所有通道的值,类似生成器的对象
print(im.getdata())
# 获取第一个通道的值,生成类序列对象,转化为列表打印
print(list(im.getdata(0)))
close()
关闭图像映像释放内存。之后图片数据将无法使用。
im.close()