- pillow 的安装及引用
- 图形基础 Image 类
- 创建图片
- 加载图片
- Image 图形对象的常用方法和属性
- resize 方法
- convert 方法
- paste 方法
- rotate 方法
- filter 方法
- load 方法
- show 方法
- save 方法
- size 属性
- 释放对象资源
- 文本图形 ImageFont 类
- 从字体文件创建图形的字体对象
- ImageFont 字体的常用方法
- getbbox 方法
- 绘画 ImageDraw 类
- 创建绘画对象
- 画点
- 画线
- 画圆
- 画文本
pillow 是 python 的一个比较常用的图形处理及绘制的第三方库 pillow 的安装及引用
pip install pillow
from PIL import Image, ImageDraw图形基础 Image 类
pillow 最基础最常用的就是 Image 类了,它可以创建、载入一张图片,然后进行进一步的处理
创建图片使用 Image 的 new 方法可以创建一个新的图形对象,格式为 PIL.Image.new(mode, size, color=0) -> PIL.Image.Image 。
- mode :图形模式,最常用的格式为 RGB (三色模式) 和 RGBA (带 alpha 通道即透明效果的 RGB 模式)。
RGB 模式下每个像素信息为三字节,分别表示该像素的红绿蓝值,取值范围 0-255 共256级,数值越大该色越亮,所以 (0,0,0) 为最暗是黑色,(255,255,255)为最亮是白色。RGBA 模式下多了一个字节的透明度,0为图形最暗即完全透明,255为图形最亮即完全不透明。 - size :创建图形的大小,有一个元组 (x,y) 表示,单位像素。
- color :创建图形的颜色,是一个颜色元组,需要和 mode 相匹配。
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255)) # 创建一个 120x30 大小的白色的 RGB 图形 new_img = Image.new(mode='RGBA', size=(200, 100), color=(255, 255, 255, 0)) # 创建一个 200x100 大小的白色且完全透明的 RGBA 图形
通常创建的图形可以作为“画布”,之后各种处理和绘画都会在画布上进行。
加载图片使用 Image 的 open 方法可以加载一个图形文件,格式为 PIL.Image.open(fp, mode="r", formats=None) ->PIL.Image.Image 。
- fp :即 filepath ,文件路径
- mode :加载模式,默认只读
- format :使用那种图形格式来加载图片文件,默认 None 即尝试所有支持的文件格式
image = Image.open('image.png')
Image 图形对象的常用方法和属性
当加载或创建了一个图形对象后,可以使用一些方法对其进行操作
resize 方法使用 resize 方法可以重新调整大小,格式为 Image.resize(size, resample=None, box=None, reducing_gap=None) ->PIL.Image.Image
- size : 调整后的大小,一个由宽和高组成的二元元组,单位是像素
- resample : 重采样过滤器
- box : 一个可选的4元元组浮点数,提供要缩放的源图像区域。这些值必须在 (0, 0, width, height) 矩形内。默认无表示整个源图像
- reducing_gap : 采样优化
image = Image.open('image.png')
imgae.resize((500, 400))
需注意的是可能出现比例失调以及锯齿化的情况
convert 方法convert 方法可以转换图像模式,其格式为 Image.convert(mode=None, matrix=None, dither=None, palette=Palette.WEB, colors=256)
- mode : 转换的模式,默认不转换,常用的参数类型有 L (灰度,8位)、RGB(三原色,8x3位)、RGBA(带alpha通道的三原色,8x4位)、1(黑白,1位像素但存储为8位)、YCbCr(彩色视频格式,3x8位)
im = im.convert('L')
paste 方法
可以使用 paste 方法将一个 Image 对象粘贴当前对象中,格式为 Image.paste(im, box=None, mask=None)
- im : 要复制的 Image 对象
- box : 使用4元元组表示要粘贴到当前对象的位置及大小,使用2元元组表示粘贴大小(位置为默认的 0,0),默认为None表示坐标(0,0)处粘贴且不改变大小
- mask :遮罩图像
image = Image.open('image.png')
img = Image.open('small_imgae.png')
image.paste(img, (50, 50, 100, 100))
rotate 方法
rotate 方法可以选择图像,格式为 Image.rotate(angle,expand=0,center=None,fillcolor=None)->Image
- angle : 以逆时针方向选择的角度
- expand : 如果为真,则扩展输出图像以使其足够大以容纳整个旋转图像。如果为 false 或省略,则使输出图像与输入图像大小相同。
- center : 选择中心坐标,以图像左上角为原点
- fillcolor : 旋转后没有图像信息的像素的填充颜色
image = image.rotate(90)filter 方法
filter 方法可以进行图像滤波,主要是对图像进行平滑、锐化、边界增强等滤波处理。格式为 Image.filter(filter)->Image
filter 是过滤器,是 pillow 里的一个类: ImageFilter,较常使用的有:
- BLUR :模糊
- CONTOUR :轮廓
- DETAIL :细节
- EDGE_ENHANCE : 边缘强化
- EMBOSS :浮雕
- FIND_EDGES :边缘突出
- SHARPEN :锐化
- SMOOTH :平滑
img = img.filter(ImageFilter.EMBOSS)load 方法
用于获取图像的像素信息,返回值是一个存储了像素信息的矩阵。
pix_info = img.load() # 获取 img 的像素信息,因为是矩阵,所以可用使用坐标进行定位 pix = pix_info[100, 200] # 返回目标坐标的像素信息show 方法
当处理完图像时,可以使用 show 方法进行查看。show 方法将创建一个临时文件,并使用默认图像浏览软件打开这个临时文件。
image = Image.open('image.png')
image.show(title=None) # title 是打开图像的标题
save 方法
save 方法用于保存为文件,格式为 Image.save(fp, format=None)
- fp : filepath,文件路径
- format : 保存格式
image.save('image.png')
size 属性
可以使用 size 属性获取对象的宽和高
width, height = img.size释放对象资源
使用 Image.close() 方法关闭对象并释放资源
文本图形 ImageFont 类ImageFont 用于处理图像中的文本
从字体文件创建图形的字体对象使用 ImageFont 的 truetype 方法,可以从 TrueType 类型的字体文件创建图形的字体对象。相当于画板中输入文本的工具。
格式为 ImageFont.truetype(font=None, size=10, index=0, encoding="", layout_engine=None) -> Font
- font : 字体文件的文件名,如果当前目录没有此文件则会在系统字体文件夹内查找
- size : 字体的大小,单位为像素
- index : 需要从字体文件中加载的字体,默认第一个可用的字体
- encoding : 编码格式,默认为 unicode
- layout_engine : 使用的引擎
font = ImageFont.truetype('msyh_boot.ttf',size=28)
ImageFont 字体的常用方法
getbbox 方法
getbbox 方法可以根据一段文本获取其相对于给定锚点的相对位置及大小(getsize方法即将不再使用,用此方法进行替代),格式为 ImageFont.getbbox(text,mode="",direction=None,features=None,language=None,stroke_width=0,anchor=None) -> tuple(left, top, right, bottom)
- text : 渲染的文本
- direction : 文本方向,例如 rtl (右到左) 、ttb (上到下) 等,需要库支持
- language : 文本语言
- stroke_width : 文本笔划的宽度
- anchor : 文本对其锚点,默认左上角
print(font.getbbox('x')) # (0, 0, 8, 11) 即锚点位置 0, 0 渲染的文本大小为 (8-0, 11-0)
绘画 ImageDraw 类
ImageDraw 用于绘制图形
创建绘画对象使用 ImageDraw 的 Draw 方法能够创建一个绘画对象,在一个 Image 对象上绘制图形。格式为 ImageDraw.Draw(im, mode=None) ->ImageDraw
- im : 要绘制图形的 Image 对象
- mode : 创建的模式,类似于 Image 对象的 mode 模式
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255)) draw = ImageDraw.Draw(img, mode='RGB')画点
使用 ImageDraw 的 point 方法可以绘制一个点。格式为 ImageDraw.point(xy, fill=None)
- xy : 要绘制点的坐标,二元元组
- fill : 绘制的颜色,可以是 ‘red’、‘black’ 等预设的颜色字符串或 RGB 色
draw = ImageDraw.Draw(img, mode='RGB') draw.point((100, 20), fill='black')画线
使用 ImageDraw 的 line 方法绘制一条线。格式为 ImageDraw.line(xy, fill=None, width=0, joint=None)
- xy : 要绘制的线的坐标,4元元组,表示起点坐标和终点坐标
- fill : 绘制的颜色,可以是 ‘red’、‘black’ 等预设的颜色字符串或 RGB 色
- width : 绘制线宽度,单位像素
draw.line((10, 10, 100, 20), fill=(0, 0, 0))画圆
使用 ImageDraw 的 arc 方法绘制圆形。格式为 ImageDraw.arc(xy, start, end, fill=None, width=1)
- xy : 要绘制圆形所在的正方形位置,四元元组,表示正方形的左上角和右下角坐标
- start : 绘制圆形的开始角度,以三点钟方向为 0 度,顺时针
- end : 绘制圆形的结束角度,以三点钟方向为 0 度,顺时针
- fill : 绘制的颜色
- width : 绘制的宽度
draw.arc((10, 10, 100, 100), 0, 270, fill='red', width=4)画文本
使用 ImageDraw 的 text 方法直接绘制文本。格式为 ImageDraw.text(xy,text,fill=None,font=None,anchor=None,spacing=4,align='left',direction=None,features=None,language=None,stroke_width=0,stroke_fill=None,embedded_color=False)
- xy : 要绘制文本的左上角坐标
- text : 文本内容
- fill : 绘制的颜色
- font : 使用的字体对象 (ImageFont对象)
draw.text((10, 10), 'hello world', fill='red')



