使用PIL绘制图像的更快方法?

时间:2017-10-06 21:41:00

标签: python image plot drawing

我从草图中栅格化了一组(x,y)坐标:

x = [167, 109, 80, 69, 58, 31]
y = [140, 194, 227, 232, 229, 229]

我想重新创建该草图并将其另存为图像。目前我正在使用PIL绘制线功能,如下所示:

from PIL import Image, ImageDraw
img = [[1, 1]]
im = Image.new('L', (256, 256), 255)
imgdata = np.array(img[0][1])*256 + np.array(img[0][1])
draw = ImageDraw.Draw(im)
for i in range(len(x)-1):
    draw.line((x[i],y[i], x[i+1], y[i+1]),fill=0,width=2)
im.save('test.png')

output

我想知道是否有更快的方法来做到这一点。 (x,y)点是按照绘制顺序排列的,所以使用Image.putdata()可能有帮助吗?

1 个答案:

答案 0 :(得分:1)

这或多或少证明了我在评论中提出的建议(在strerror()调用中没有*前缀)关于能够仅使用一次调用来{{1}来绘制整行。 1}}。

优点是代码更少,而且稍微更快(即使测试数据不明显)。

zip()

对于 Python 3.x ,您需要使用draw.line()将行更改为以下(虽然在Python 2中可以执行,但需要额外的,虽然无害,但处理不必要):

import numpy as np
from PIL import Image, ImageDraw

img = [[1, 1]]
x = [167, 109, 80, 69, 58, 31]
y = [140, 194, 227, 232, 229, 229]

im = Image.new('L', (256, 256), 255)
imgdata = np.array(img[0][1])*256 + np.array(img[0][1])
draw = ImageDraw.Draw(im)

#for i in range(len(x)-1):
#    draw.line((x[i],y[i], x[i+1], y[i+1]),fill=0,width=2)

draw.line(zip(x, y), fill=0, width=2)  # Draws entire line.
#im.save('test.png')
im.show()  # Display the image.