用于图像和pil模块的Python循环

时间:2010-11-18 11:46:27

标签: python python-imaging-library

我在Python中使用PIL和Image模式。 我想用这段代码创建一个图像:

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,color)中的循环:

每次增加一步颜色。例如RGB [0],下一个循环RGB [1]等等。 虽然这个循环正在制作,但x和y对我来说更难。 x从1到12(图像大小),而y为0,然后,当x到达imagesize时,它返回到1到12但y现在是1.当x到达图像大小的末尾时,循环结束。 / p>

任何人都可以帮助我吗?我是Python的新手。

此致

Favolas

修改

P:S - 忘了说因为这是一个学校项目我不能使用除img.new,img.show和img.outpixel之外的任何方法

4 个答案:

答案 0 :(得分: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 :(得分:1)

这取决于您想要如何放置RGB颜色。例如:

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

将0到N个像素中的0到N RBG颜色,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)]

两种情况的优化都留作练习。

答案 2 :(得分: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。

有关填充图像的更好方法,请参阅其他答案,并且可能还有更多的pythonic方法。但这是通用答案!

请注意,这适用于以零开头而不是一开始的变量。对于12x12像素图像,有效xy范围为0到11。

答案 3 :(得分: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()]

作为测试,打印输入的mock 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()返回结果,因此我们的结果列表将包含空值。