2010-11-18 98 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()返回结果,因此我们的结果列表将包含空容器。