映像和pil模块的Python循环
我在Python中使用PIL和图像模式。 我想用以下代码创建一个图像:映像和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
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)