Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
映像和pil模块的Python循环_Python_Python Imaging Library - Fatal编程技术网

映像和pil模块的Python循环

映像和pil模块的Python循环,python,python-imaging-library,Python,Python Imaging Library,我在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

我在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.....)]
我需要一个循环,在。像素(xy,颜色):

颜色每增加一步。例如RGB[0],下一个循环RGB[1]等等。 在做这个循环时,x和y对我来说更难。 当y为0时,x从1变为12(图像大小),当x达到imagesize时,它返回到1到12,但y现在是1。当x和x都达到图像大小的末尾时,循环结束

有人能帮我吗?我是Python新手

问候,

法沃拉斯

编辑


p:S-忘了说,因为这是一个学校项目,所以除了img.new、img.show和img.outpixel之外,我不能使用任何方法,这取决于你想要如何放置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)]

这两种情况的优化都只是一个练习。

好的,我上面的评论应该已经成为答案了。我应该睡一会儿。基本上,您可以立即将像素数据放入图像中。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

如果你有嵌套的循环,i从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。

如果我们有以下两个列表:

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()方法验证结果:

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()返回结果,因此我们的结果列表将包含空值。

另一方面,putpixel通常非常慢。您可能希望使用putdata,一次设置所有图像数据。看起来您自己并没有试图解决此问题…嗨,谢谢您的回答。但它给了我这个错误:回溯(最近一次调用最后一次):文件“”,第48行,在ZeroDivisionError:integer division或modulo by ZeroDivision这是一个学校项目,除了img.new、img.show和img.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)