使用Python字典编辑图像
首先,我是编程的新手,所以可能会问一些傻问题;)
我创建了一个字典,像这样:
cell = {(1,2):200,(1,2):200,(1,2):200,(1,2):200,...}
现在我用Image创建了一张新图片。我的想法是用cell.keys()里的值,比如(1,2),来访问图片的像素坐标,然后把这个坐标的值改成字典里对应的值。我该怎么做呢?我尝试过“解包”,但除了“语法错误”之外没有成功。
cell = {}
for i in range (255):
for k in range (255):
cell.update({(i,k):random.randrange(1,150,2)})
img = Image.new('RGB',(255,255), 'WHITE')
pixels = img.load() # create the pixel map
for k in cell.keys():
pixels[*k] = (*k, cell[k]) # here I get the invalid syntax at '*k'
1 个回答
2
只需把 k
当作键来用:
pixels[k] = k + (cell[k],)
你有一张 RGB 图片,所以你需要一个包含 3 个值的元组。k
是一个包含 两个 值的元组,所以我猜你想要的是一个 (i, j, random_value)
的元组来表示像素值。
*k
只在函数的定义、调用时有效,还有在 Python 3 中用于元组赋值。它在索引或创建元组时没有特别的含义。
注意,使用 dict.update()
来更新一个只有一个元素的字典是比较低效的。直接用项赋值就可以了:
cell = {}
for i in range(255):
for k in range(255):
cell[(i,k)] = random.randrange(1,150,2)
不过,字典并不是存储稠密矩阵的最佳格式;更好的选择是使用嵌套列表:
cell = [[random.randrange(1,150,2) for _ in range(255)] for _ in range(255)]
然后用以下方式来处理:
for i, row in enumerate(cell):
for j, value in enumerate(row):
pixels[i, j] = (i, j, value)