2017-08-02 77 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 –