当前位置: 代码迷 >> 综合 >> Python Pillow 库 ImageDraw
  详细解决方案

Python Pillow 库 ImageDraw

热度:16   发布时间:2023-12-15 18:44:49.0

原文链接: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))