2017-10-06 35 views
1

我有一组(X,Y)坐标光栅化从草图:用PIL绘制图像的更快方式?

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()可以提供帮助吗?

+0

'Image.putdata()'会要求你通过一些其他手段来创建像素数据,然后将它塞进一个'Image'对象,你想要做的,除非我怀疑你可以找到一些现有的模块来做到这一点(画线)。你正在用PIL做到最快的方式。 – martineau

+1

但是注意['ImageDraw.line()'](http://pillow.readthedocs.io/en/4.3.x/reference/ImageDraw.html#PIL.ImageDraw.PIL.ImageDraw.ImageDraw.line)将接受在一次调用中调用坐标,所以你可以移除'for'循环并获得至少一些速度提升。 – martineau

+1

摆脱'for'循环并尝试使用一个'draw.line(* zip(x,y),fill = 0,width = 2)'调用。 – martineau

回答

1

这更多或更少的证明就是我在对能够只使用一个电话绘制全线draw.line()评论(SAN的*前缀的zip()呼叫)的暗示。

它的好处是它需要更少的代码,并且可能会更快(即使测试数据并不明显)略快

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. 

对于Python 3.x都有你需要更改使用zip()以下(其中,而这将是确定在Python 2做,将需要额外的线路,虽然无害,处理该是没有必要的):

draw.line(list(zip(x, y)), fill=0, width=2) # Draws entire line.