'tuple'对象不支持项目分配

时间:2011-10-07 12:52:03

标签: python python-imaging-library

我正在使用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 个答案:

答案 0 :(得分:43)

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)元组。

答案 1 :(得分:7)

第二行应该是pixels[0],带有S.你可能有一个名为pixel的元组,元组是不可变的。改为构造新的像素:

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

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

image.putdate(pixels)

答案 2 :(得分:5)

在python中的元组不能改变它们的值。如果您想更改包含的值,我建议使用列表:

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

答案 3 :(得分:3)

您可能希望为您的像素进行下一次转换:

pixels = map(list, image.getdata())

答案 4 :(得分:1)

元组是不可变的,因此您会收到您发布的错误。

>>> pixels = [1, 2, 3]
>>> pixels[0] = 5
>>> pixels = (1, 2, 3)
>>> pixels[0] = 5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

在您的具体情况下,正如其他答案中正确指出的那样,您应该写:

pixel = (pixel[0] + 20, pixel[1], pixel[2])

答案 5 :(得分:0)

您错误地将第二个pixels拼错为pixel。以下作品:

pixels = [1,2,3]
pixels[0] = 5

看来由于拼写错误,你试图意外修改一些名为pixel的元组,而在Python中,元组是不可变的。因此令人困惑的错误信息。