pip install pillow
from PIL import Image, ImageDraw
pillow 最基础最常用的就是 Image 类了,它可以创建、载入一张图片,然后进行进一步的处理
使用 Image 的 new 方法可以创建一个新的图形对象,格式为 PIL.Image.new(mode, size, color=0) -> PIL.Image.Image 。
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 。
image = Image.open('image.png')
当加载或创建了一个图形对象后,可以使用一些方法对其进行操作
使用 resize 方法可以重新调整大小,格式为 Image.resize(size, resample=None, box=None, reducing_gap=None) ->PIL.Image.Image
image = Image.open('image.png')
imgae.resize((500, 400))
需注意的是可能出现比例失调以及锯齿化的情况
convert 方法可以转换图像模式,其格式为 Image.convert(mode=None, matrix=None, dither=None, palette=Palette.WEB, colors=256)
im = im.convert('L')
可以使用 paste 方法将一个 Image 对象粘贴当前对象中,格式为 Image.paste(im, box=None, mask=None)
image = Image.open('image.png')
img = Image.open('small_imgae.png')
image.paste(img, (50, 50, 100, 100))
rotate 方法可以选择图像,格式为 Image.rotate(angle,expand=0,center=None,fillcolor=None)->Image
image = image.rotate(90)
filter 方法可以进行图像滤波,主要是对图像进行平滑、锐化、边界增强等滤波处理。格式为 Image.filter(filter)->Image
filter 是过滤器,是 pillow 里的一个类: ImageFilter,较常使用的有:
img = img.filter(ImageFilter.EMBOSS)
用于获取图像的像素信息,返回值是一个存储了像素信息的矩阵。
pix_info = img.load() # 获取 img 的像素信息,因为是矩阵,所以可用使用坐标进行定位
pix = pix_info[100, 200] # 返回目标坐标的像素信息
当处理完图像时,可以使用 show 方法进行查看。show 方法将创建一个临时文件,并使用默认图像浏览软件打开这个临时文件。
image = Image.open('image.png')
image.show(title=None) # title 是打开图像的标题
save 方法用于保存为文件,格式为 Image.save(fp, format=None)
image.save('image.png')
可以使用 size 属性获取对象的宽和高
width, height = img.size
使用 Image.close() 方法关闭对象并释放资源
ImageFont 用于处理图像中的文本
使用 ImageFont 的 truetype 方法,可以从 TrueType 类型的字体文件创建图形的字体对象。相当于画板中输入文本的工具。
格式为 ImageFont.truetype(font=None, size=10, index=0, encoding="", layout_engine=None) -> Font
font = ImageFont.truetype('msyh_boot.ttf',size=28)
getbbox 方法可以根据一段文本获取其相对于给定锚点的相对位置及大小(getsize方法即将不再使用,用此方法进行替代),格式为 ImageFont.getbbox(text,mode="",direction=None,features=None,language=None,stroke_width=0,anchor=None) -> tuple(left, top, right, bottom)
print(font.getbbox('x')) # (0, 0, 8, 11) 即锚点位置 0, 0 渲染的文本大小为 (8-0, 11-0)
ImageDraw 用于绘制图形
使用 ImageDraw 的 Draw 方法能够创建一个绘画对象,在一个 Image 对象上绘制图形。格式为 ImageDraw.Draw(im, mode=None) ->ImageDraw
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)
draw = ImageDraw.Draw(img, mode='RGB')
draw.point((100, 20), fill='black')
使用 ImageDraw 的 line 方法绘制一条线。格式为 ImageDraw.line(xy, fill=None, width=0, joint=None)
draw.line((10, 10, 100, 20), fill=(0, 0, 0))
使用 ImageDraw 的 arc 方法绘制圆形。格式为 ImageDraw.arc(xy, start, end, fill=None, width=1)
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)
draw.text((10, 10), 'hello world', fill='red')