Python Pillow - ImageDraw 模块



在 Pillow 中绘制图像涉及使用 Pillow 库(Python Imaging Library)向现有图像添加各种视觉元素,例如线条、形状、文本等等。这是图像处理中的一项常见任务,用于图像标注、创建可视化效果、添加标签或标题以突出感兴趣的区域等。

我们可以使用 Pillow 中的 ImageDraw 模块创建一个绘图对象,然后使用该对象的各种方法在图像上进行绘制。我们可以使用 line()、rectangle()、ellipse()、text() 等方法在图像上绘制各种元素。

在图像上绘制文本

为了在图像上绘制或写入文本,我们可以使用 Pillow 库中的 ImageDraw.Draw() 函数,此方法创建一个绘图对象,允许我们对图像执行绘图操作。

语法

以下是 Draw() 方法的语法和参数:

PIL.ImageDraw.Draw(image, mode=None)

其中,

  • image − 此参数表示我们要在其上执行绘图操作的图像。它是 Pillow Image 对象的一个实例。

  • mode (可选) − 此参数指定绘图将发生的模式。可用的模式包括:

    • 1 − 1 位像素(单色)
    • L − 8 位像素,黑白
    • RGB − 3x8 位像素,真彩色
    • RGBA − 4x8 位像素,带透明度
    • CMYK − 4x8 位像素,CMYK 颜色空间
    • HSV − 3x8 位像素,HSV 颜色空间

以下两个示例将使用的输入图像。

faces

示例

在这个例子中,我们使用 ImageDraw 模块的 Draw() 方法在图像上添加文本。

from PIL import Image, ImageDraw, ImageFont

#Open an image
image = Image.open("Images/faces.jpg")

#Create a drawing object
draw = ImageDraw.Draw(image)

#Define text attributes
text = "Welcome to Tutorialspoint"
font = ImageFont.truetype("arial.ttf", size=30)
text_color = (0, 0, 255)  

#Blue
text_position = (50, 50)

#Add text to the image
draw.text(text_position, text, fill=text_color, font=font)

#Save or display the image with the added drawing elements
image.save("output Image/drawnimage.jpg")

#Open the output drawn image
opendraw = Image.open("output Image/drawnimage.jpg")
opendraw.show()

输出

drawnimage

示例

这是另一个使用 Draw() 方法在图像中间添加文本的示例。

from PIL import Image, ImageDraw, ImageFont

#Open an image
image = Image.open("Images/faces.jpg")

#Create a drawing object
draw = ImageDraw.Draw(image)

#Define text attributes
text = "Welcome to Tutorialspoint"
font = ImageFont.truetype("arial.ttf", size=30)
text_color = (255, 0, 0)

#Add text to the image
draw.text(xy=(25, 160), 
   text = text,
   font = font,
   fill= text_color)

#Save or display the image with the added drawing elements
image.save("output Image/drawnimage.jpg")

#Open the output drawn image
opendraw = Image.open("output Image/drawnimage.jpg")
opendraw.show()

输出

drawnimage faces

在图像上绘制矩形

在 Pillow 库 (PIL) 中,PIL.ImageDraw.Draw.rectangle() 方法用于使用指定的轮廓和填充颜色在图像上绘制矩形。此方法是 ImageDraw 模块的一部分,通常在使用 PIL.ImageDraw.Draw() 创建的 ImageDraw 对象上调用。

语法

以下是 PIL.ImageDraw.Draw.rectangle() 方法的语法和参数:

ImageDraw.Draw.rectangle(xy, outline=None, fill=None, width=0)

其中,

  • xy − 此参数指定矩形的坐标,作为两个点的元组。每个点表示为 (x1, y1) 和 (x2, y2),其中 (x1, y1) 是矩形的左上角,(x2, y2) 是矩形的右下角。

  • outline − 此参数是可选的,指定矩形轮廓的颜色。我们可以提供一个颜色字符串(例如,“red” 或 "#FF0000")或表示 RGB 颜色的元组(例如,(255, 0, 0))。如果设置为 None,则不绘制轮廓。

  • fill − 此参数是可选的,指定填充矩形的颜色。与 outline 参数一样,我们可以将填充颜色指定为字符串或 RGB 元组。如果设置为 None,则矩形不会被填充。

  • width − 这是一个可选参数,用于指定矩形轮廓的宽度。默认值为 0,这意味着矩形将被填充而没有轮廓。

以下两个示例将使用的输入图像。

black_white

示例

在这个例子中,我们使用 PIL.ImageDraw.Draw.rectangle() 方法在给定的输入图像上绘制一个矩形。

from PIL import Image, ImageDraw

#Open an image
image = Image.open("Images/bw.png")

#Create a drawing object
draw = ImageDraw.Draw(image)

#Define the coordinates for the rectangle
xy = [(100, 100), (200, 200)]

#Draw a filled red rectangle
draw.rectangle(xy, outline="blue", fill="red", width = 3)

#Save or display the modified image
image.save("output Image/output.jpg")
image.show()

输出

rect_output

示例

这是另一个绘制矩形的示例,将 outline 参数指定为 Blue,fill 参数指定为 None

from PIL import Image, ImageDraw

#Open an image
image = Image.open("Images/bw.png")

#Create a drawing object
draw = ImageDraw.Draw(image)

#Define the coordinates for the rectangle
xy = [(100, 100), (200, 200)]

#Draw a filled red rectangle
draw.rectangle(xy, outline= "Blue", fill= None, width = 2)

#Save or display the modified image
image.save("output Image/output.jpg")
image.show()

输出

rect_imagedraw

在图像上绘制线条

PIL.ImageDraw.Draw.line() 是 Python Imaging Library (PIL) 或 Pillow 库提供的方法。Pillow 是 PIL 的一个更现代且积极维护的分支,用于在图像上绘制线条。此方法是 PIL/Pillow 中用于在图像上绘制形状、文本和其他图形的 ImageDraw 模块的一部分。

语法

以下是 PIL.ImageDraw.Draw.line() 方法的语法:

PIL.ImageDraw.Draw.line(xy, fill=None, width=0, joint=None)

其中,

  • xy − 指定线段端点的 (x, y) 坐标序列。

  • fill − 此参数是可选的,指定线条的颜色。它可以是指定颜色名称的字符串、(R, G, B) 元组或整数值。如果没有指定,线条将为黑色。

  • width − 此参数是可选的,指定线条的宽度(以像素为单位)。默认值为 0,这意味着线条的宽度为 1 像素。

  • joint − 此参数是可选的,可用于指定线条的连接样式。它可以是以下值之一:

    • None (默认) − 线条具有常规连接。

    • curve − 线条具有圆形连接。

    • miter − 线条具有尖角连接。

以下两个示例将使用的输入图像。

faces

示例

在这个例子中,我们使用 PIL.ImageDraw.Draw.line() 方法在输入图像上绘制一条线。

from PIL import Image, ImageDraw, ImageFont

#Open an image
image = Image.open("Images/faces.jpg")

#Create a drawing object
draw = ImageDraw.Draw(image)

#Draw a line
line_coordinates = [(100, 200), (200, 200)]
draw.line(line_coordinates,width=10)

#Save or display the image with the added drawing elements
image.save("output Image/drawnimage.jpg")

#Open the output drawn image
opendraw = Image.open("output Image/drawnimage.jpg")
opendraw.show()

输出

lineimage

示例

这是另一个使用 PIL.ImageDraw.Draw.line() 方法的示例,将 joint 参数指定为 curve

from PIL import Image, ImageDraw

#Open an image
image = Image.open("Images/faces.jpg")

#Create a drawing object
draw = ImageDraw.Draw(image)

#Define the endpoints and draw a red line
line_color = "Yellow"  
#Red color
start_point = (0, 10)
end_point = (200, 500)
line_width = 3
draw.line([start_point, end_point], fill=line_color, width=line_width, joint = "curve")

#Save or display the modified image
image.save("output.jpg")
image.show()

输出

lineimage draw

在图像上绘制多边形

PIL.ImageDraw.Draw.polygon() 是 Pillow 库中 ImageDraw 对象提供的方法。它允许我们在图像上绘制多边形。多边形是一个具有多条边的封闭形状,因此我们可以指定顶点的坐标来定义多边形的形状。

此方法是 ImageDraw.Draw 对象的一部分,用于创建并使用指定的颜色填充多边形形状。

语法

以下是 PIL.ImageDraw.Draw.polygon() 方法的语法:

PIL.ImageDraw.Draw.polygon(xy, fill=None, outline=None)

其中,

  • xy − 这是一个元组列表或坐标的扁平列表,指定多边形的顶点。每个元组或坐标对代表多边形的一个顶点。

  • fill − 此参数是可选的,指定多边形内部的填充颜色。如果我们想要多边形没有填充,我们可以将其设置为 None。

  • outline − 此参数是可选的,指定多边形轮廓或边框的颜色。如果我们不想要轮廓,则可以将其设置为 None。

以下两个示例将使用的输入图像。

black_white

示例

在这个例子中,我们使用 PIL.ImageDraw.Draw.polygon() 方法在图像上绘制一个多边形,并指定参数 xy、filloutline

from PIL import Image, ImageDraw

#Open an image
image = Image.open("Images/bw.png")

#Create a drawing object
draw = ImageDraw.Draw(image)

#Define the vertices of the polygon
polygon_vertices = [(100, 100), (200, 100), (150, 200)]

#Draw a filled polygon with a blue interior and a red outline
draw.polygon(polygon_vertices, fill="blue", outline="red")

#Save or display the modified image
image.save("output Image/output.jpg")
image.show() 

输出

polygon

示例

这是一个另一个示例,其中我们将 PIL.ImageDraw.Draw.polygon() 方法的 fill 参数设置为 None 以避免填充多边形。

from PIL import Image, ImageDraw

#Open an image
image = Image.open("Images/bw.png")

#Create a drawing object
draw = ImageDraw.Draw(image)

#Define the vertices of the polygon
polygon_vertices = [(100, 100), (200, 100), (150, 200),(100,150),(90,100)]

#Draw a filled polygon with a blue interior and a red outline
draw.polygon(polygon_vertices, fill= None, outline="red")

#Save or display the modified image
image.save("output Image/output.jpg")
image.show()

输出

imagedraw polygon

ImageDraw 模块方法

除了上述方法之外,此模块还提供许多其他特定方法,可用于特定条件。让我们探索并了解每种方法的基本功能:

序号 方法及描述
1

ImageDraw.arc()

在指定的边界框内绘制一个弧形。

2

ImageDraw.chord()

在边界框内绘制一条弦(圆的一部分)。

3

ImageDraw.pieslice()

在边界框内绘制一个填充的扇形。

4

ImageDraw.point()

在图像上指定坐标处绘制点(单个像素)。

5

ImageDraw.regular_polygon()

使用给定的边界圆绘制一个正多边形。

6

ImageDraw.rounded_rectangle()

绘制一个圆角矩形。

7

ImageDraw.multiline_text()

在图像上的指定位置绘制多行文本。

广告