2010-11-18 122 views
4

我在Python中使用PIL和圖像模式。 我想使用此代碼創建一個圖像:圖像和pil模塊的Python循環

imagesize = (12,12) 
image = Image.new("RGB",imagesize,color=None) 

我將使用這個功能把我的像素圖像上:

.putpixel(xy, color) 

顏色是一個元組列表。對於爲例:

RGB = [((255, 255, 255),(207, 103, 36),(204, 93, 21),(204, 93, 21),(204, 93, 21), (.......some more RGB tuples.....)] 

我需要一個循環,在.putpixel(XY,顏色):

顏色遞增每次一個步驟。例如RGB [0],下一個循環RGB [1]等等。 雖然這個循環正在進行,但x和y對我來說更加困難。 x從1到12(圖像大小),而y是0,然後,當x達到圖像大小時,它將返回到1到12,但y現在爲1.當x和兩者都達到圖像大小的末尾時,循環結束。

任何人都可以幫助我嗎?我是Python新手。

問候,

Favolas

編輯

,P:的S - 忘了說,因爲這是一所學校的項目,我不能使用除了img.new任何方法,img.show和img.outpixel

+1

在旁註中,putpixel通常非常緩慢。您可能想要使用putdata,而是一次性設置圖像數據。 – 2010-11-18 11:49:11

+0

它看起來並不像你所做的任何嘗試自己解決這個問題...... – martineau 2014-04-01 11:41:42

回答

2

好的,我從上面的評論應該真的回答了一個答案。我應該睡一會兒。你基本上可以把你的像素數據一次放入圖像中。 PIL.Image的putdata方法接受構成圖像像素的元組列表。所以:

img = PIL.Image.new("RGB", (12, 12)) 
img.show() # see a black image 
pixels = [(255,0,0)]*(12*12) 
img.putdata(pixels) 
img.show() # see a red image 
+1

這是一個學校項目,我不能在img.new,img.show和img.putpixel之外使用任何方法:) – Favolas 2010-11-18 12:15:47

1

這取決於你想如何把RGB顏色。例如:

for y in range(12): 
    for x in range(12): 
    img.putpixel(x, y, RGB[(x + 12*y)%len(RBG)] 

將把0到N RBG顏色在0到N個像素,0到N位RGB到0 + N,2N個像素等。 還有另一個選擇 - 隨機選擇的顏色:

兩種情況
import random 
... 
for y in range(12): 
    for x in range(12): 
    img.putpixel(x, y, RBG[random.randint(0, len(RGB)-1)] 

優化留作練習。

+1

Hi.Thanks for your answer。但它給了我這個錯誤:回溯(最近呼叫最後): 文件「」,第48行,在 ZeroDivisionError:整數除或零 – Favolas 2010-11-18 12:11:56

+1

@Favolas謝謝你,修正。 '(x + 12 * y)%len(RGB)' – khachik 2010-11-18 12:17:38

1

如果您有嵌套的循環,我從0到11和j從0到11,再到指數逐漸成一維向量,你需要得到X [J + I * 11]。

>>> for i in range(5): 
... for j in range(5): 
...  print j + i*5 

將打印0到24

見其他答案更好的方法來填補圖像,並有可能過於這樣做的更Python的方式。但這是一般的答案!

請注意,這是針對從零開始的變量,而不是一個。對於12x12像素的圖像,有效的xy範圍從0到11。

1

如果我們有這兩個列表:

xy = [(1,2),(3,4),(5,6),(7,8)] 
rgb = [(0,0,255), (0,255,0), (255,0,0), (255,255,0), (255,255,255)] 

我們可以在XY列表到RGB列表映射到詞典:

d = dict(zip(xy,rgb)) 

,看起來像這樣:

>>> print(d) 
{(1, 2): (0, 0, 255), (5, 6): (255, 0, 0), (3, 4): (0, 255, 0), (7, 8): (255, 255, 0)} 

所以我們現在有一本字典,關鍵是XY,值是相應的RGB。現在我們可以使用list comprehension映射這些鍵值對:

[putpixel(x,col) for x,col in d.items()] 

作爲一個測試,一個模擬的putpixel()方法,打印輸入驗證結果:

def putpixel(xy,col): 
    print('%s set to %s' % (xy,col)) 

>>> result = [putpixel(x,col) for x,col in d.items()] 
(1, 2) set to (0, 0, 255) 
(5, 6) set to (255, 0, 0) 
(3, 4) set to (0, 255, 0) 
(7, 8) set to (255, 255, 0) 

列表理解通常返回一個列表在這種情況下,我們不會從putpixel()返回結果,因此我們的結果列表將包含空容器。