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

4

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

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

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

from PIL import Image, ImageDraw

im = Image.new('L', (256, 256), 255)
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')

我想知道是否有更快的方法来完成这个任务。 (x,y) 点是按照绘制顺序排列的,因此也许可以使用 Image.putdata() 方法来帮助实现?

output


“Image.putdata()”需要您通过其他方式创建像素数据,然后将其填充到“Image”对象中——除非您能找到某个现有模块来完成它(画线),否则我认为您不想这样做。使用PIL是最快的方法。 - martineau
1
请注意,ImageDraw.line() 可以在单个调用中接受所有坐标,因此您可以删除 for 循环并获得至少一些速度提升。 - martineau
1
摆脱for循环,尝试使用单个draw.line(*zip(x, y), fill=0, width=2)调用。 - martineau
@martineua: 太棒了。我不知道我们能这样做。draw.line(zip(x, y), fill=0, width=2) 对我有用(没有星号)。不确定它是否更快,但至少现在代码看起来非常整洁。请将您的评论转换为答案。如果在接下来的两天里没有人提供更好的解决方案,我会接受它。 - Tu Bui
1个回答

4
这更或多或少展示了我在评论中所建议的(不包括zip()调用时的*前缀)仅使用一次draw.line()调用就能绘制整条线的方法。
优点是它将需要更少的代码,可能会稍微快一些(即使在测试数据中可能看不出来)。
try:
    from itertools import izip
except ImportError:  # Python 3
    izip = zip
from PIL import Image, ImageDraw

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

im = Image.new('L', (256, 256), 255)
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(list(izip(x, y)), fill=0, width=2) # Draws entire line.
#im.save('test.png')
im.show()  # Display the image.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接