11 pillow图像库
Pillow 中文文档:https://pillow-cn.readthedocs.io/zh_CN/latest/
PIL库
PIL (Python Image Library) 已经算是 Python 处理图片的标准库了,兼具强大的功能和简洁的 API.
但是PIL库的更新非常缓慢, 并且它只支持到python2.7,不支持python3
Pillow
由于PIL库更新太慢了,于是于是一群志愿者在PIL库的基础上创建了一个新的分支版本,命名为Pillow.
Pillow目前最新支持到python3.6,它的维护和开发十分活跃,兼容PIL库的绝大多数语法,并且增加了许多新的特性,推荐直接使用Pillow
注意点
Pillow和PIL不能共存在一个环境中,如果你之前安装了PIL的话,需要删除掉才能在安装Pillow
由于是继承自PIL的分支, 所以Pillow库的导入是这样的
Import PIL
一、PIL基本概念
PIL中所涉及的基本概念有如下几个:通道(bands)、尺寸(size)、坐标系统(coordinate system)。
通道:
每张图片都是由一个或者多个数据通道构成,如果这些通道具有相同的维数和深度,PIL允许将这些通道进行叠加
以RGB图像为例,每张图片都是由三个数据通道叠加构成,分别为R 、G 、B。
对于灰度图像(没有色彩的图片, RGB色彩分量全部相等),只有一个通道。
灰度指的是黑白图像中点的颜色深度,范围一般是0到255, 白色为255,黑色为0
对于一张图片的通道数量和名称,可以通过方法getbands()来获取。方法getbands()是PIL中Image子模块的方法,它会返回一个字符串组成的元祖,元祖中包括了每一个通道的名称。
尺寸:
图片尺寸(size)指的是图片的宽度和高度
通过size属性可以获取图片的尺寸,它的返回值是一个元祖,元祖里面有两个值,分别是水平和垂直方向上的像素个数
坐标系统 :
PIL使用笛卡尔像素坐标系统,图像的左上角为左边的原点(0,0),这就意味着,x轴的数值是从左到右增长的,y轴的数值是从上到下增长的。
在我们处理图像的时候,常常需要去表示一个矩形的图像区域。Pillow中很多方法都需要传入一个表示矩形区域的元祖
这个元祖包含四个值,分别表示矩形四条边距离x轴或者y轴的距离。顺序是(左,顶,右,底)
例如,一个800x600的像素图像表示为(0, 0, 800, 600)
from PIL import Image
im = Image.open('yasuo.jpg')
# 获取通道
print('通道:', im.getbands())
# 获取尺寸size
print('尺寸:',im.size)
# 调用系统默认图片打开应用打开
im.show()
二、基本使用





1、加载图像
# 加载图像
im1 = Image.open('yasuo.jpg')
# 显示图片
im1.show()
# 获取图像的size及mode
# .format属性标识了图像的来源,如果图像不是从文件读取则返回None
# .size返回一个元组(width,height),单位为px
# .mode定义了图像bands的数量和名称,以及像素类型和深度,常见的值有"L"(luminance,灰度图),"RGB"(真彩色图像),"CMYK"(出版图像).
print('format:', im1.format)
print('size:', im1.size)
print('mode:',im1.mode)
2、新建图像
# 创建新的图像
im2 = Image.new('RGBA',(400,400),'red')
im2.show()
3、剪切图像
# 剪切图像
box = (100,100,700,700)
im3 = im1.crop(box)
im3.show()
4、旋转图像
# 使用.rotate(x)对图像进行旋转(x:图片逆时针旋转的角度)
im4 = im3.rotate(90)
# im4.show()
# 使用.transpose()对图片进行旋转
# 可传入的参数有:
# Image.FLIP_LEFT_RIGHT #图片左右翻转
# Image.FLIP_TOP_BOTTOM #图片上下翻转
im5 = im1.transpose(Image.FLIP_LEFT_RIGHT)
im6 = im1.transpose(Image.FLIP_TOP_BOTTOM)
im7 = im1.transpose(Image.ROTATE_90)
im5.show()
im6.show()
im7.show()
5、粘贴合并
# 使用.paste()对图片进行黏贴合并
# 粘贴矩形选区时必须保持尺寸一致
im8 = im1.crop((0,0,100,100))
im8.show()
im1.paste(im8,(700,700,800,800))
im1.show()
6、通道的分离与合并
from PIL import Image
im1 = Image.open('yasuo.jpg')
# 通道的分离与合并
r,g,b = im1.split()
print(r,g,b)
im = Image.merge("RGB", (g, b, r))
im.show()
7、缩放图像
# 缩放图像
# .resize((width,height))对图像进行大小变换,生成新的图像对象,原图不变
im9 = im1.resize((400,600))
im9.show()
# .thumbnail(self, size, resample=BICUBIC) 改变图像的大小,形成缩略图,原图改变
im1.thumbnail((200,200),Image.ANTIALIAS)
im1.show()
8、mode变换
# .convert("mode")颜色变换
# "L"(luminance,灰度图),"RGB"(真彩色图像),"CMYK"(出版图像).
im10 = im1.convert("L")
im11 = im1.convert("CMYK")
im12 = im1.convert('RGBA')
im13 = im1.convert('RGB')
print(im12.mode)
im12.show()
9、保存图像
# 保存图片
# .save()保存图片
im10.save("yasuo_L.jpg")
三、绘图
1、draw line
line(xy, fill)
from PIL import Image, ImageDraw
im1 = Image.open('1.jpg')
draw = ImageDraw.Draw(im1)
draw.line((0, 0)+im1.size, fill=120)
draw.line((0, im1.size[1], im1.size[0], 0), fill=120)
im1.show()
2、draw text
text(xy, text, fill, font, spacing, direction)
from PIL import Image, ImageDraw
im1 = Image.open('1.jpg')
draw = ImageDraw.Draw(im1)
draw.text((60, 60), 'good', fill=(0, 0, 0, 255))
im1.show()
3、draw arc
arc(xy,start,end,fill)
这个方法是画圆,xy需要给个box。比如在像素点(0,0)和(100,100)之间画圆。start是初始角度,0度为正右方。end当然就是结束角度,不过注意,画圆方向为顺时针,fill同上。
from PIL import Image, ImageDraw
im1 = Image.open('1.jpg')
draw = ImageDraw.Draw(im1)
draw.arc([60,60,500,500],0,270,fill='red')
im1.show()
4、draw chord
chord(xy, start, end, fill, outline)
这个方法和arc功能相同,outline是划线颜色,而fill是填充颜色。与arc的区别是,画完图之后,会将末位点和起始点连接起来。
from PIL import Image, ImageDraw
im1 = Image.open('1.jpg')
draw = ImageDraw.Draw(im1)
# 这个方法和arc功能相同,outline是划线颜色,而fill是填充颜色。与arc的区别是,画完图之后,会将末位点和起始点连接起来。
draw.chord([60,60,120,100],0,270,fill='blue', outline='yellow')
im1.show()
5、draw pieslice
pieslice
参数和功能都和chord一样,区别在于最后将末位点与起始点连接到中心
from PIL import Image, ImageDraw
im1 = Image.open('1.jpg')
draw = ImageDraw.Draw(im1)
# 参数和功能都和chord一样,区别在于最后将末位点与起始点连接到中心
draw.pieslice([60,60,120,100],0,270,fill='blue', outline='yellow')
im1.show()
6、draw ellipse
参数和画圆的都一样,而且通过arc也可以实现相同的功能
from PIL import Image, ImageDraw
im1 = Image.open('1.jpg')
draw = ImageDraw.Draw(im1)
# 参数和画圆的都一样,而且通过arc也可以实现相同的功能
draw.ellipse([60,60,500,300],fill='red')
im1.show()
7、draw rectangle
rectangle(xy,fill,outline)
绘制矩形,xy给出rectangle的左上和右下的像素点坐标,fill填充,outline是pen color。
from PIL import Image, ImageDraw
im1 = Image.open('1.jpg')
draw = ImageDraw.Draw(im1)
# 绘制矩形,xy给出rectangle的左上和右下的像素点坐标,fill填充,outline是pen color。
draw.rectangle([60,60,500,300],fill='red',outline='yellow')
im1.show()
8、draw polygon
polygon(xy, fill, outline)
polygon,多边形。xy又是个像素点坐标的序列
from PIL import Image, ImageDraw
im1 = Image.open('1.jpg')
draw = ImageDraw.Draw(im1)
# polygon,多边形。xy又是个像素点坐标的序列
draw.polygon([60,60,100,60,130,80,80,150],fill='red',)
im1.show()
8、draw point
point
(xy, fill)
from PIL import Image, ImageDraw
im1 = Image.open('1.jpg')
draw = ImageDraw.Draw(im1)
# 画点
draw.point([60,60,62,60,64,60,66,60,68,60,70,60],fill='blue',)
im1.show()
四、其它功能


1、截屏
ImageGrab.grab() 实现抓屏
from PIL import ImageGrab
image1 = ImageGrab.grab() #可传入一个元组表示抓取屏幕的坐标
print(image1.size,image1.mode)
# image1.save("截屏.jpg")
image1.show()
2、滤镜
使用.filter()对图片进行滤镜处理
from PIL import Image, ImageFilter
im1 = Image.open('yasuo.jpg')
# im1.show()
im2 = im1.filter(ImageFilter.BLUR)
im2.show()
3、综合例子
#图片处理:
from PIL import Image
from PIL import ImageFilter
from PIL import ImageEnhance
img = Image.open("D:\python\dog.jpg")
print(img.format) # 输出图片基本信息
print(img.mode)
print(img.size)
img_resize = img.resize((256,256)) # 调整尺寸
img_resize.save("dogresize.jpg")
img_rotate = img.rotate(45) # 旋转
img_rotate.save("dogrotate.jpg")
om=img.convert('L') # 灰度处理
om.save('doggray.jpg')
om = img.filter(ImageFilter.CONTOUR) # 图片的轮廓
om.save('dogcontour.jpg')
om = ImageEnhance.Contrast(img).enhance(20) # 对比度为初始的10倍
om.save('dogencontrast.jpg')
#更改图片格式:
from PIL import Image
import os
filelist =["dog.jpg",
"dogcontour.jpg",
"dogencontrast.jpg",
"doggray.jpg",
"dogresize.jpg",
"dogrotate.jpg",
]
for infile in filelist:
outfile = os.path.splitext(infile)[0] + ".png"
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print ("cannot convert", infile)
网友评论