2017-08-02 78 views
0

我试图创建一个Perlin噪声应用程序,它随机生成一个游戏地图。我正在尝试写入新图像,但只有第一行正在写入。Pillow/PIL Python - 只写入图像的第一行

这里是我创建了一个存根表现出了同样的问题:

from PIL import Image 
from random import randint 

height = 25 
width = 25 

z = randint(-1000, 1000)/100 

img = Image.new('RGBA', (width, height), color=(255, 255, 255, 255)) 

for y in range(height): 
    img.putdata([(0,255,0,255) for x in range(width)]) # Logic error occurs on this line 
img.save("location.png", "PNG") 

什么愚蠢的错误我在做这个时间呢?

+0

'Image.putdata()'想要整个图像的数据在一个序列中;它不支持分块构建图像。 – jasonharper

+0

你可以用putpixel代替putdata,但这可能会很慢。如果您试图将图像的某个区域设置为相同的值,则可以使用“ImageDraw”模块的功能,例如, 'ImageDraw.Draw.rectangle()'。 – ahota

回答

0

你必须提供以下的像素信息方法:

img.putdata([(0,255,0, 255) for x in range(width) for y in range(height)]) 

您所提供的信息的方式,将创造25分列出了每个25元的,而功能需要625元,没有任何子上市。

+0

感谢您的简单建议:D –

0

那么你需要一个填充整个图像的序列。每次你打电话时,putdata从0,0开始,所以你只需从0,0开始写入每次序列的结尾。获取序列足够长的做这样的事情来填满整个图像:

height = 25 
width = 25 
data = [255 * randint(-1000, 1000)/100 for x in range(width * height)] 

然后你可以使用putdata这样的:

img = Image.new('RGBA', (width, height), color=(255, 255, 255, 255)) 
img.putdata(data) 
img.save("location.png", "PNG") 
+0

感谢您的详细回复:D –