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 = pixel + 20 image.putdata(pixels) image.save('new.bmp')
However I get this error:
TypeError: 'tuple' object does not support item assignment
PIL pixels are tuples, and tuples are immutable. You need to construct a new tuple. So, instead of the for loop, do:
pixels = [(pixel + 20, pixel, pixel) 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 + 20, 255) or
int(255 * (pixel / 255.) ** 0.9) instead of
pixel + 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.
The second line should have been
pixels, with an S. You probably have a tuple named
pixel, and tuples are immutable. Construct new pixels instead:
image = Image.open('balloon.jpg') pixels = [(pix + 20,) + pix[1:] for pix in image.getdata()] image.putdate(pixels)
Tuples, in python can’t have their values changed. If you’d like to change the contained values though I suggest using a list:
You probably want the next transformation for you pixels:
pixels = map(list, image.getdata())
A tuple is immutable and thus you get the error you posted.
>>> pixels = [1, 2, 3] >>> pixels = 5 >>> pixels = (1, 2, 3) >>> pixels = 5 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
In your specific case, as correctly pointed out in other answers, you should write:
pixel = (pixel + 20, pixel, pixel)
You have misspelt the second
pixel. The following works:
pixels = [1,2,3] pixels = 5
It appears that due to the typo you were trying to accidentally modify some tuple called
pixel, and in Python tuples are immutable. Hence the confusing error message.