使用Python字典编辑图像

1 投票
1 回答
636 浏览
提问于 2025-04-18 10:29

首先,我是编程的新手,所以可能会问一些傻问题;)

我创建了一个字典,像这样:

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)

撰写回答