Python循环遍历图像与PIL模块

5 投票
4 回答
9140 浏览
提问于 2025-04-16 07:16

我在用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

撰写回答