Python循环遍历图像与PIL模块
我在用Python的PIL库和图像模式。
我想用这段代码创建一张图片:
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达到图片的大小时,y就变成1,x又从1到12。这个循环会在x和y都到达图片的大小时结束。
有人能帮我吗?我刚开始学Python。
谢谢,
Favolas
编辑
附注 - 我忘了说,因为这是一个学校项目,所以我不能使用除了img.new、img.show和img.putpixel以外的任何方法。
4 个回答
1
这要看你想怎么使用RGB颜色了。比如:
for y in range(12):
for x in range(12):
img.putpixel(x, y, RGB[(x + 12*y)%len(RBG)]
这段代码会把0到N的RGB颜色放到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
假设我们有这两个列表:
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。接下来,我们可以用列表推导式来处理这些键值对:
[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()没有返回结果,所以我们的结果列表会包含空值。
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