我在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之外的任何方法答案 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()返回结果,因此我们的结果列表将包含空值。