原文链接:https://zhuanlan.zhihu.com/p/59849190
简介
ImageDraw 模块也是 Pillow 库的主要模块之一,它能给图像化圆弧,画横线,写上文字等。
引入 ImageDraw 模块
from PIL import Image, ImageDraw # 引入 ImageDraw
需要对图像进行Draw操作,首先需要创建 Draw 对象
draw = ImageDraw.Draw(im) # 创建 Draw 对象
ImageDraw.arc 添加圆弧
ImageDraw.arc(xy,start,end,fill=None,width=0)
在给定的边界(左,上,右,下)内绘制圆弧。圆弧使用 fill-颜色和 width-宽度的线条从start角度开始到end角度结束。
参数:
- xy – 定义边界的坐标[(x0, y0), (x1, y1)] or [x0, y0, x1, y1],
- start –起始角度,单位度。 角度从水平位置右方开始,顺时针方向为正。
- end – 结束角度
- fill – 线条填充颜色,'red',(255,0,0), '#FF0000',125 等。ImageColor 中的颜色表达方式。
- width – 线条宽度,单位 pixels
示例:
draw.arc((0, 0,100,100) , start=0, end=300, fill='red',width=3)
ImageDraw.pieslice
ImageDraw.pieslice(xy,start,end,fill=None,outline=None,width=0)
与圆弧差不多,差别在于两端点之间用直线连接,里面填充 fill 颜色。
参数:
- xy – 定义边界的坐标[(x0, y0), (x1, y1)] or [x0, y0, x1, y1],
- start –起始角度,单位度。 角度从水平位置右方开始,顺时针方向为正。
- end – 结束角度
- fill – 线条填充颜色,'red',(255,0,0), '#FF0000',125 等。ImageColor 中的颜色表达方式。
- outline – 轮廓线条颜色
- width – 线条宽度,单位 pixels
示例:
draw.pieslice((0, 0)+ im.size , start=0, end=300, outline="#FF0000",fill='#FFFFFF',width=3)
ImageDraw.chord 画圆弧(端点相连)
ImageDraw.chord(xy,start,end,fill=None,outline=None,width=0)
与 arc( ) 类似,区别在与起始点与结束点使用直线相连,中间区域填充 fill 颜色,外部线条使用 outline 颜色。
参数:
- xy – 定义边界的坐标[(x0, y0), (x1, y1)] or [x0, y0, x1, y1],
- start –起始角度,单位度。 角度从水平位置右方开始,顺时针方向为正。
- end – 结束角度
- outline – 轮廓线条颜色
- fill – 填充颜色
- width – 线条宽度,单位 pixels
示例:
draw.chord((0, 0, 200, 200), 0, 90, fill=(100, 20, 60), outline="#FF0000")
ImageDraw.bitmap 根据蒙版绘制图像
ImageDraw.bitmap(xy,bitmap,fill=None)
根据bitmap为蒙版从(x,y)位置开始填充 fill -颜色。与Image.paste(im, box, mask) 方法类似,paste 填充图像,bitmap 填充颜色。
参数:
- xy – 起始坐标,( x , y )
- bitmap – 作为蒙版的图像。必须是含透明图 mode=1 或能做遮罩的 mode (L or RGBA)
- fill – 填充颜色
示例:
bitmap = Image.open('../img/logo.png')
draw.bitmap((0, 0), bitmap, 'red')
ImageDraw.ellipse 画椭圆
ImageDraw.ellipse(xy,fill=None,outline=None,width=0)
在 xy区域内画椭圆
参数:
- xy – 定义边界的坐标[(x0, y0), (x1, y1)] or [x0, y0, x1, y1],
- outline – 轮廓线条颜色
- fill – 填充颜色
- width – 线条宽度,单位 pixels
示例:
draw.ellipse((0, 0, 200, 100), fill=(100, 20, 60), outline="#FF0000", width=3)
ImageDraw.line 画线条
ImageDraw.line(xy,fill=None,width=0,joint=None)
在xy列表中的坐标之间绘制一条线。
参数:
- xy – 点与点之间坐标,[(x0, y0), (x1, y1),...] or [x0, y0, x1, y1,....],
- fill – 线条填充颜色
- width – 线条宽度,单位 pixels
- joint – 线之间的联合类型,如:curve 圆角。
示例:
draw.line((0, 0)+ im.size, width=5,fill=128)
ImageDraw.point 坐标点填充颜色
ImageDraw.point(xy,fill=None)
给xy列出的坐标点上填充颜色
参数:
- xy – 点与点之间坐标,[(x0, y0), (x1, y1),...] or [x0, y0, x1, y1,....],
- fill – 填充颜色
示例:
xy = [(i, i) for i in range(0, 300, 5)]
draw.point(xy, "#FF0000")
ImageDraw.rectangle 画长方型
ImageDraw.rectangle(xy,fill=None,outline=None,width=0)
画长方形
参数:
- xy – 定义边界框,[(x0, y0), (x1, y1)] or [x0, y0, x1, y1],
- outline – 轮廓线条颜色
- fill – 填充颜色
- width – 线条宽度,单位 pixels
示例:
draw.rectangle((20, 20, 200, 100), fill=(100, 20, 60), outline="#FF0000", width=3)
ImageDraw.text 绘制文字
ImageDraw.text(xy,text,fill=None,font=None,anchor=None,spacing=0,align="left",direction=None,features=None)
给定位置绘制字符串
参数:
- xy – 文字的左上角位置
- text – 文本. 如果包含换行符需将文本传递给 multiline_text()
- fill – 文字颜色
- font – 字体,需要时 ImageFont 实例。
- spacing – 如果文本传递给multiline_text(),则为行之间的像素数。
- align – 对齐方式,如果文本传递给multiline_text(), 值有"left","center","right"。
- direction – 文字方向。'rtl'(从右到左),'ltr'(从左到右)或'ttb'(从上到下)
- features – 在文本布局期间使用的OpenType字体功能列表。通常用于打开默认情况下未启用的可选字体功能,如'dlig'或'ss01';也可用于关闭默认字体功能,例如'-liga'以禁用连字或'-kern'禁用字距调整。参阅:Registered features - Typography
示例:
from PIL import ImageFont
im = Image.new(‘RGB’, (300, 300), 0)
# 创建可绘制的对象
draw = ImageDraw.Draw(im)
# 设置字体,将字体库复制到当前目录
font = ImageFont.truetype(‘arialbi.ttf’, 32)
# 填充文字
draw.text((10,10), “woodman”, font=font, fill="#FFFFFF")
ImageDraw.multiline_text 绘制带换行的文字
ImageDraw.multiline_text(xy,text,fill=None,font=None,anchor=None,spacing=0,align=“left”,direction=None,features=None)
绘制带换行的文字
参数:同 ImageDraw.text
示例:
from PIL import ImageFont
im = Image.new(‘RGB’, (300, 300), 0)
# 创建可绘制的对象
draw = ImageDraw.Draw(im)
# 设置字体,将字体库复制到当前目录
font = ImageFont.truetype(‘arialbi.ttf’, 32)
# 填充文字
draw.multiline_text((10,10), “Hello,\nwoodman”, font=font, fill="#FFFFFF")
ImageDraw.textsize 获取文字的大小
ImageDraw.textsize(text,font=None,spacing=4,direction=None,features=None)
获取文字的大小,(width, height)
参数:
- text – 文本. 如果包含换行符需将文本传递给 multiline_text()
- font – 字体,需要时 ImageFont 实例。
- spacing – 如果文本传递给multiline_text(),则为行之间的像素数。
- align – 对齐方式,如果文本传递给multiline_text(), 值有"left",“center”,“right”。
- direction – 文字方向。‘rtl’(从右到左),‘ltr’(从左到右)或’ttb’(从上到下)
- features – 在文本布局期间使用的OpenType字体功能列表。通常用于打开默认情况下未启用的可选字体功能,如’dlig’或’ss01’;也可用于关闭默认字体功能,例如’-liga’以禁用连字或’-kern’禁用字距调整。参阅:Registered features - Typography
示例:
from PIL import ImageFont
im = Image.new(‘RGB’, (300, 300), 0)
# 创建可绘制的对象
draw = ImageDraw.Draw(im)
# 设置字体,将字体库复制到当前目录
font = ImageFont.truetype(‘arialbi.ttf’, 32)
# 获取文字大小
print(draw.textsize(‘woodman’,font))
ImageDraw.multiline_textsize 获取带换行的文字的大小
ImageDraw.multiline_textsize(text,font=None,spacing=4,direction=None,features=None)
获取带换行的文字的大小
参数:同 ImageDraw.textsize
from PIL import ImageFont
im = Image.new(‘RGB’, (300, 300), 0)
# 创建可绘制的对象
draw = ImageDraw.Draw(im)
# 设置字体,将字体库复制到当前目录
font = ImageFont.truetype(‘arialbi.ttf’, 32)
# 获取文字大小
print(draw.multiline_textsize(‘Hello,\nwoodman’,font))