Pillow的介绍与使用
- 2020.05.25
Pillow简介
Pillow是Python平台事实上的图像处理标准库了。功能非常强大,但API却非常简单易用,提供了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。早期的版本是PIL(由于PIL仅支持2.7的版本)后来志愿者们在其基础上进行了版本升级和兼容,命名为Pillow。
安装
如果安装了Anaconda,Pillow就已经可用了。否则,我们可以在命令行下通过pip安装:
pip install pillow
Image类
Image类是PIL中最重要的类,许多常用的方法都需要从Image类中导入
from PIL import Image
打开一张图片
Image.open(fp, mode =’r’ ): 打开图片文件,返回一个Image对象
| 参数名 | 描述 | 
|---|---|
| fp | 图片路径 | 
| mode | 模式。如果给出,必须是 r | 
图像的对象属性有filename源文件的文件名或路径、format图片的格式、size图片大小,以像素为单位、mode图片模式、width图像宽度、height图像高度、palette调色板表等;
from PIL import Image
# 同级目录下的图片不要加相对路径'./img.png'
path = 'img.png'
im = Image.open(path)
# <PIL.PngImagePlugin.PngImageFile image mode=P size=350x142 at 0x1077A3750>
保存图片
Image.save(fp, format=None, **params): 保存图像到给定的文件名下,如果没有指定格式则可以使用文件扩展名来确定要使用的格式,无返回值。
| 参数名 | 描述 | 
|---|---|
| fp | 文件名或路径 | 
| format | 可选的格式覆盖 | 
指定图像的大小
Image.thumbnail(size, resample=3): 指定图片的像素,size是大小,resample是重采样滤波器。
| 参数名 | 描述 | 
|---|---|
| size | 图像的大小 | 
| resample | 重采样滤波器 ( Image.NEAREST、Image.BILINEAR、Image.BICUBIC、Image.LANCZOS、默认为Image.BICUBIC) | 
旋转图片的方向
Image.rotate(angle, resample=0, expand=0, ceter=None, translate=None): 旋转图片的方向,返回旋转后的图像副本,一个Image对象 。
| 参数名 | 描述 | 
|---|---|
| angle | 角度(逆时针旋转) | 
| resample | 重采样滤波器 | 
| expand | 是否展开 | 
| ceter | 旋转中心 | 
| translate | 旋转后 | 
图片加滤镜
Image.filter(filter): 给图片添加滤镜,返回一个Image对象。
| 参数名 | 描述 | 
|---|---|
| filter | 过滤器 | 
旋转或翻转图像
Image.transpose(method): 旋转或翻转图像,返回旋转或翻转后的图像副本,一个Image对象。
| 参数名 | 描述 | 
|---|---|
| method | 模式( Image.FLIP_LEFT_RIGHT、Image.FLIP_TOP_BOTTOM、Image.ROTATE_90、Image.ROTATE_180、Image.ROTATE_270、Image.TRANSPOSE、Image.TRANSVERSE | 
显示图像
Image.show(): 显示这个图像,此方法主要用于调试目的;
import os
from PIL import Image, ImageDraw, ImageFilter
path = os.path.join(os.getcwd(),'img.png')
im = Image.open(path)
# 获取图片的后缀名
fExit = im.format.lower()
# 获取图片的格式,大小,以及模式
print(im.format, im.size, im.mode, fExit)
# 指定图片的像素
im.thumbnail((128,128))
im.save('./image_128_128.{exit}'.format(exit = fExit))
# 旋转图片的方向
dest_im = im.rotate(90)
dest_im.save('./image_rotate.{exit}'.format(exit = fExit))
# 给图片添加滤镜  image has wrong mode
# dest_im = im.filter(ImageFilter.GaussianBlur)
# dest_im.show()
# 图片反转
dest_im = im.transpose(Image.FLIP_LEFT_RIGHT)       # 左右反转
dest_im = im.transpose(Image.FLIP_TOP_BOTTOM)   # 上下反转
dest_im.show()
# 图片上写文字
image = Image.open(path)
img_draw = ImageDraw.Draw(image)
img_draw.text((770,250),'hello world',fill='black')   # 放上文字信息到图像上
image.show()
ImageDraw类
ImageDraw模块为Image对象提供简单的2D图形,可以使用此模块创建新图像,注释或润饰现有图像,以及动态生成图形以供Web使用;
创建可用于在给定图像中绘制的对象
ImageDraw.Draw(im,mode=None):创建可用于在给定图像中绘制的对象
| 参数名 | 描述 | 
|---|---|
| im | 要绘制的图像 | 
| mode | 用于颜色值的可选模式 | 
在给定位置绘制字符串
ImageDraw.text(xy,text,fill=None,font=None,anchor=None,spacing=0,align =“left”,direction = None,features=None,language=None):在给定位置绘制字符串
| 参数名 | 描述 | 
|---|---|
| xy | 文本的左上角 | 
| text | 要绘制的文本 | 
| fill | 文本的颜色 | 
| font | 一个ImageFont实例 | 
| anchor | 用于颜色值的可选模式 | 
| spacing | 如果文本传递给 multiline_text(),则为行之间的像素数 | 
| align | 如果文本传递给 multiline_text(),“left”,“center”或“right”。 | 
| direction | 文字的方向。它可以是'rtl'(从右到左),'ltr'(从左到右)或'ttb'(从上到下)。需要libraqm。 | 
| features | 在文本布局期间使用的OpenType字体功能列表。这通常用于打开默认情况下未启用的可选字体功能,例如'dlig'或'ss01',但也可用于关闭默认字体功能,例如'-liga'以禁用连字或' - kern'禁用字距调整。 | 
| language | 文字的语言 | 
给定坐标处绘制点
ImageDraw.point(xy,fill=None):在给定坐标处绘制点。
| 参数名 | 描述 | 
|---|---|
| xy | 元组的序列或类似的数值 | 
| fill | 点的颜色 | 
批量将图片大小设置为指定大小的例子
import os
from PIL import Image
# 源目录
project_dir = os.path.dirname(os.path.abspath(__file__))
input = os.path.join(project_dir, 'src')
# 输出目录
output = os.path.join(project_dir, 'dest')
def modify():
    # 切换目录
    os.chdir(input)
    # 遍历目录下所有的文件
    for image_name in os.listdir(os.getcwd()):
        print(image_name)
        im = Image.open(os.path.join(input, image_name))
        im.thumbnail((128, 128))
        im.save(os.path.join(output, image_name))
if __name__ == '__main__':
    modify()