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
6 Answers
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.
The second line should have been pixels[0], 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[0] + 20,) + pix[1:] for pix in image.getdata()] image.putdate(pixels) 0Tuples, in python can't have their values changed. If you'd like to change the contained values though I suggest using a list:
[1,2,3] not (1,2,3)
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[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 In your specific case, as correctly pointed out in other answers, you should write:
pixel = (pixel[0] + 20, pixel[1], pixel[2]) You have misspelt the second pixels as pixel. The following works:
pixels = [1,2,3] pixels[0] = 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.