Pillow(PIL)是Python平台事实上的图像处理标准库,支持多种格式,并提供强大的图形与图像处理功能。PIL 模块全称为 Python Imaging Library,是Python中一个免费的图像处理模块。PIL 仅支持到 Python 2.7。Python3用的是PIL的兼容版本Pillow。本文主要介绍Pillow(PIL) ImageDraw的使用。

1、Pillow(PIL)的安装及常用操作

参数文档:Python Pillow(PIL)安装及Image 类的使用

2、 ImageDraw

ImageDraw 可以绘制各种几何图形的绘制和文本,如直线、椭圆、弧、弦、多边形以及文字等。Coordinates是绘图接口使用和PIL一样的坐标系统,即(0,0)为左上角。Colours是为了指定颜色,用户可以使用数字或者元组,对应用户使用函数Image.new或者Image.putpixel。对于模式为“1”,“L”和“I”的图像,使用整数。对于“RGB”图像,使用整数组成的3元组。对于“F”图像,使用整数或者浮点数。Colours Names在PIL 1.1.4及其以后的版本,用户绘制“RGB”图像时,可以使用字符串常量。Fonts是PIL可以使用bitmap字体或者OpenType/TrueType字体。

1)draw.arc(xy, start, end, fill=None, width=0)

在给定的区域内,在开始和结束角度之间绘制一条弧。

参数:

xy:变量xy是需要设置一个区域,此处使用4元组,包含了区域的左上角和右下角两个点的坐标。
start:起始角度,以度为单位。角度从3点开始测量,顺时针方向增加。
end:终止角度,以度为单位。
fill:用于弧线的颜色。
width:线宽,以像素为单位。

from PIL import Image, ImageDraw

img = Image.open(r"D:\cjavapy.jpg")
draw = ImageDraw.Draw(img)
draw.arc((0,0,200,200),0,90,fill = 222)#圆
draw.arc((200,200,400,500),0,-90,fill = 222)#椭圆
draw.arc((200,200,300,300),-90,0,fill = 222)#圆
img.show()

2)draw.bitmap(xy, bitmap, fill=None)

在给定位置绘制bitmap (mask) ,对非零部分使用当前填充颜色。bitmap应该是有效的透明mask(模式“1”)或matte(模式“L”或“RGBA”)。

参数:

xy:变量bitmap对应位图起始的坐标值,不是一个区域。
bitmap:bitmap是一个有效的透明模板(模式为“1”)或者蒙版(模式为“L”或者“RGBA”)。
fill:非零部分使用fill的值来填充。

from PIL import Image, ImageDraw

im1 = Image.open(r"D:\cjavapy.jpg")
im2 = Image.open(r"D:\python.jpg")
im = im2.resize((80,100),Image.ANTIALIAS)
print(im.size)
r,g,b = im.split()
draw = ImageDraw.Draw(im1)
draw.bitmap((0,0),r,fill=111)
draw.bitmap((80,100),g,fill=(0,255,0))
draw.bitmap((160,200),b,fill=(0,0,255))
im1.show()

3)draw.chord(xy, start, end, fill=None, outline=None, width=1)

与arc()相同,但用一条直线连接端点。

参数:

xy:用两点来定义边界框。[(x0, y0), (x1, y1)][x0, y0, x1, y1]的序列,其中x1 >= x0y1 >= y0
start:起始角度,以度为单位。角度从3点开始测量,顺时针方向增加。
end:终止角度,以度为单位。
fill:用于填充的颜色。
outline:用于轮廓的颜色。
width:线宽,以像素为单位。

from PIL import Image, ImageDraw

img = Image.open(r"D:\cjavapy.jpg")
draw = ImageDraw.Draw(img)
draw.chord((0,0,200,200),0,90,fill=128,outline=222)
img.show()

4)draw.ellipse(xy, fill=None, outline=None, width=1)

在给定的包围框内绘制一个椭圆。

参数:

xy:用两点来定义边界框。[(x0, y0),(x1, y1)][x0, y0, x1, y1]的序列,其中x1 >= x0y1 >= y0
fill:用于填充的颜色。
outline:用于轮廓的颜色。
width:线宽,以像素为单位。

from PIL import Image, ImageDraw

img = Image.open(r"D:\cjavapy.jpg")

draw = ImageDraw.Draw(img)
draw.ellipse((0,0,200,200),fill=123)
draw.ellipse((200,200,300,400),fill=123)
img.show()

5)draw.line(xy, fill=None, width=0, joint=None)

在xy列表中的坐标之间绘制一条线。

参数:

xy:2元组序列,如[(x, y), (x, y),…]或数值,如[x, y, x, y,…]
fill:线条的颜色。
width:线宽,以像素为单位。

from PIL import Image, ImageDraw

img = Image.open(r"D:\cjavapy.jpg")
draw = ImageDraw.Draw(img)
draw.line([(0,0),(100,50),(50,100)],fill=123,width=3)
draw.line([0,20,50,90,100,300,200,80],fill=222,width=10)
img.show()

6)draw.pieslice(xy, start, end, fill=None, outline=None, width=1)

与圆弧相同,但也在边界框的端点和中心之间绘制直线。

参数:

xy:用两点来定义边界框。[(x0, y0), (x1, y1)][x0, y0, x1, y1]的序列,其中x1 >= x0y1 >= y0
start:起始角度,单位是角度。角度从3点钟开始测量,顺时针增加。
end:结束角,单位是度数。
fill:用于填充的颜色。
outline:用于轮廓的颜色。
width:线宽,以像素为单位。

from PIL import Image, ImageDraw

img = Image.open(r"D:\cjavapy.jpg")
draw = ImageDraw.Draw(img)
draw.pieslice((0,0,200,200),0,90,fill = 222)#扇形
draw.pieslice((200,200,400,500),0,-90,fill = 222)#椭圆扇形
draw.pieslice((200,200,300,300),-90,0,fill = 222)#圆扇形
img.show()

7)draw.point(xy, fill=None)

在给定的坐标上绘制点(单个像素)。

参数:

xy:2元组序列,如[(x, y), (x, y),…]或数值,如[x, y, x, y,…]
fill:点的颜色。

from PIL import Image, ImageDraw

img = Image.open(r"D:\cjavapy.jpg")
draw = ImageDraw.Draw(img)
draw.point((100,100),fill=123)
draw.point((101,101),fill=(0,0,0))
img.show()

8)draw.polygon(xy, fill=None, outline=None, width=1)

绘制一个多边形。多边形轮廓由给定坐标之间的直线组成,加上最后一个坐标和第一个坐标之间的直线。

参数:

xy:2元组序列,如[(x, y),(x, y),…]或数值,如[x, y, x, y,…]
fill:用于填充的颜色。
outline:用于轮廓的颜色。
width:线宽,以像素为单位。

from PIL import Image, ImageDraw

img = Image.open(r"D:\cjavapy.jpg")
draw = ImageDraw.Draw(img)
draw.polygon([(0,0),(100,50),(50,100)],fill=123)
draw.polygon([0,20,50,90,100,300,200,80],fill=222)
img.show()

9)draw.rectangle(xy, fill=None, outline=None, width=1)

绘制一个矩形。

参数:

xy:用两点来定义边界框。[(x0, y0), (x1, y1)][x0, y0, x1, y1]的序列。边界框包含两个端点。
outline:用于轮廓的颜色。
fill:用于填充的颜色。
width:线宽,以像素为单位。

from PIL import Image, ImageDraw

img = Image.open(r"D:\cjavapy.jpg")
draw = ImageDraw.Draw(img)
draw.rectangle([(0,0),(100,120)],fill=123)
draw.rectangle((120,130,200,180),fill=222)
draw.rectangle([200,200,300,400],fill=150)
img.show()

10)draw.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 :要绘制的字符串。如果它包含任何换行符,文本将被传递给multiline_text()。
fill:用于文本的颜色。
font:一个ImageFont实例。
anchor:文本锚定对齐。确定锚点与文本的相对位置。默认对齐方式是左上角。对于非truetype字体,该参数将被忽略。该参数在Pillow的早期版本中存在,但仅在8.0.0版本中实现。
spacing:如果将文本传给multiline_text(),则为行与行之间的像素数。
align:如果文本被传递给multiline_text(), "left", "center"或"right"。确定线的相对对齐。使用anchor参数指定指向xy的对齐方式。
direction:文本的方向。它可以是“rtl”(从右到左),“ltr”(从左到右)或“ttb”(从上到下)。需要libraqm。
features:在文本布局过程中使用的OpenType字体功能的列表。这通常用于打开默认情况下未启用的可选字体功能,例如"dlig"或"ss01",但也可用于关闭默认字体功能,例如"-liga"禁用连字,或"-kern"禁用字距。要获得所有受支持的特性。需要libraqm。
language:文本的语言。不同的语言可能使用不同的字形或连缀。这个参数告诉字体文本是哪种语言,并在适当的情况下应用正确的替换(如果可用的话)。它应该是BCP 47语言代码。需要libraqm。
stroke_width:文本笔画的宽度。
stroke_fill:用于文本描边的颜色。如果没有给出,将默认为填充参数。
embedded_color:是否使用字体嵌入的彩色符号(COLR、CBDT、SBIX)。

from PIL import Image, ImageDraw

img = Image.open('/data/cjavapy.jpg')
draw = ImageDraw.Draw(img)
draw.text((im.size[1]-100,100),'haha',fill=(255,0,0),font=ImageFont.truetype('/data/fonts/image.ttf'))
draw.text((100,100),'lalala',font=ImageFont.truetype('Arial/Arial.ttf',46))
img.show()

11)draw.textsize(text, font=None, spacing=4, direction=None, features=None, language=None, stroke_width=0)

9.2.0版后已移除。

使用textlength()1/64像素精度测量以下文本的偏移量。使用textbbox()来获得基于锚的精确边界框。

返回给定字符串的大小,单位为像素。

from PIL import Image, ImageDraw

img = Image.open(r"D:\cjavapy.jpg")
draw = ImageDraw.Draw(img)
print(draw.textsize('text'))
print(draw.textsize('cjavapy‘))

相关文档:

Python Pillow(PIL) 图像处理(分离、合并、裁剪、几何变换)

Python Pillow(PIL) ImageFont的使用

Python Pillow(PIL) ImageFilter和ImageColor的使用

Python Pillow(PIL)安装及Image 类的使用

推荐文档