'tuple' object does not support item assignment

dgamma3 picture dgamma3 · Oct 7, 2011 · Viewed 156.7k times · Source

I am using the PIL library.

I am trying to make an image look red-er, this is what i've got.

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')

However I get this error: TypeError: 'tuple' object does not support item assignment

Answer

Petr Viktorin picture Petr Viktorin · Oct 7, 2011

PIL pixels are tuples, and tuples are immutable. You need to construct a new tuple. So, instead of the for loop, do:

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

Also, if the pixel is already too red, adding 20 will overflow the value. You probably want something like min(pixel[0] + 20, 255) or int(255 * (pixel[0] / 255.) ** 0.9) instead of pixel[0] + 20.

And, to be able to handle images in lots of different formats, do image = image.convert("RGB") after opening the image. The convert method will ensure that the pixels are always (r, g, b) tuples.