Python Imaging Library ( PIL ) 给 Python 增加了图像处理能力。
这个库提供了广泛的文件格式支持,高效的内部展现,以及十分强大的图像处理能力。
由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow。
Python3下安装Pillow
pip install Pillow
Image类的使用
Image是PIL最重要的类, 你可以通过多种方法创建这个类的实例。可以从文件中加载图像,并对图像进行各种处理操作。
使用Image模块
from PIL import Image
从文件中加载Image对象
im = Image.open("test.jpg”)
print(im.format, im.size, im.mode)
Image的常见属性
format:图像来源。如果图像不是从文件读取它的值就是None
size:图像尺寸,一个二元tuple,包含width和height(宽度和高度,单位都是px)
mode:颜色模式, “L” (luminance) 表示灰度图像, “RGB” 表示真彩色图像, “CMYK” 表示出版图像。
图像保存
im.save(outfile, "JPEG")
图像缩略图
im.thumbnail(size)
使用Image.ANTIALIAS可以消除锯齿
im.thumbnail(size, Image.ANTIALIAS)
PIL库不会直接解码或者加载图像栅格数据。当你打开一个文件,只会读取文件头信息用来确定格式,颜色模式,大小等等,文件的剩余部分不会主动处理。这意味着打开一个图像文件的操作十分快速,跟图片大小和压缩方式无关。
图像的裁剪合并
从图像中复制出一个矩形选区
box = (100, 100, 400, 400)
region = im.crop(box)
矩形选区有一个4元元组定义,分别表示左、上、右、下的坐标。这个库以左上角为坐标原点,单位是px,所以上诉代码复制了一个 300x300 pixels 的矩形选区。这个选区现在可以被处理并且粘贴到原图。
处理复制的矩形选区并粘贴到原图
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
当你粘贴矩形选区的时候必须保证尺寸一致。此外,矩形选区不能在图像外。然而你不必保证矩形选区和原图的颜色模式一致,因为矩形选区会被自动转换颜色。
分离和合并颜色通道
r, g, b = im.split()
im = Image.merge("RGB", (b, g, r))
图像缩放
out = im.resize((128, 128))
如果要消除锯齿,可以使用Image.ANTIALIAS过滤器
out = im.resize((128, 128), Image.ANTIALIAS)
图像旋转
out = im.rotate(45)
out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)
颜色模式转换
im.convert("L")
图像滤镜
from PIL import Image, ImageFilter
#模糊滤镜
im2 = im.filter(ImageFilter.BLUR)
#轮廓滤镜
im2 = im.filter(ImageFilter.CONTOUR)
#细节增强滤镜
im2 = im.filter(ImageFilter.DETAIL)
#边缘增强滤镜
im2 = im.filter(ImageFilter.EDGE_ENHANCE)
#深度边缘增强滤镜
im2 = im.filter(ImageFilter.EDGE_ENHANCE_MORE)
#浮雕滤镜
im2 = im.filter(ImageFilter.EMBOSS)
#边缘信息滤镜
im2 = im.filter(ImageFilter.FIND_EDGES)
#平滑滤波滤镜
im2 = im.filter(ImageFilter.SMOOTH)
#深度平滑滤波滤镜
im2 = im.filter(ImageFilter.SMOOTH_MORE)
#锐化滤波滤镜
im2 = im.filter(ImageFilter.SHARPEN)
文字转换为图片
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw
#设置字体,如果没有,也可以不设置
font = ImageFont.truetype(word_ttf,word_size)
w,h = font.getsize("测")
image = Image.new("RGB",[width, height],"white")
draw = ImageDraw.Draw(image)
#一个一个写入文字
for k, text in enumerate(strlist):
for m, ch in enumerate(text):
draw.text((w*m, h*k), ch, (0,0,0), font=font) #设置位置坐标 文字 颜色 字体
#定义文件名
image.save("./output.jpg")