tuple'对象不支持项赋值

68 投票
6 回答
201103 浏览
提问于 2025-04-17 03:51

我正在使用PIL库。

我想让一张图片看起来更红,这就是我现在的代码。

from PIL import Image
image = Image.open('balloon.jpg')
pixels = list(image.getdata())
for pixel in pixels: 
    pixel[0] = pixel[0] + 20    
image.putdata(pixels)
image.save('new.bmp')

但是我遇到了这个错误:TypeError: 'tuple' object does not support item assignment

6 个回答

6

在Python中,元组(tuples)里的值是不能被改变的。如果你想要改变里面的值,建议使用列表(list):

[1,2,3] 而不是 (1,2,3)

9

第二行应该是 pixels[0],注意这里有个S。你可能有一个叫 pixel 的元组,而元组是不可改变的。你需要创建新的像素来代替:

image = Image.open('balloon.jpg')

pixels = [(pix[0] + 20,) + pix[1:] for pix in image.getdata()]

image.putdate(pixels)
64

PIL中的像素是元组,而元组是不可改变的。这意味着你需要创建一个新的元组。所以,不要用for循环,直接这样做:

pixels = [(pixel[0] + 20, pixel[1], pixel[2]) for pixel in pixels]
image.putdata(pixels)

另外,如果像素的红色值已经很高了,直接加20可能会超过最大值。你可能想用类似 min(pixel[0] + 20, 255) 或者 int(255 * (pixel[0] / 255.) ** 0.9) 的方式,而不是简单地 pixel[0] + 20

为了能够处理多种不同格式的图片,在打开图片后,记得执行 image = image.convert("RGB")。这个 convert 方法会确保像素始终是(r, g, b)的元组。

撰写回答