web-dev-qa-db-fra.com

L'objet 'Tuple' ne prend pas en charge l'affectation d'élément

J'utilise la bibliothèque PIL.

J'essaie de rendre une image plus rouge, c'est ce que j'ai.

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

Cependant, j'obtiens cette erreur: TypeError: 'Tuple' object does not support item assignment

43
dgamma3

Les pixels PIL sont des n-uplets et les n-uplets sont immuables. Vous devez construire un nouveau tuple. Alors, au lieu de la boucle for, faites:

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

De plus, si le pixel est déjà trop rouge, l'ajout de 20 débordera la valeur. Vous voulez probablement quelque chose comme min(pixel[0] + 20, 255) ou int(255 * (pixel[0] / 255.) ** 0.9) au lieu de pixel[0] + 20.

Et, pour pouvoir manipuler des images dans de nombreux formats différents, faites image = image.convert("RGB") après avoir ouvert l'image. La méthode convert s'assurera que les pixels sont toujours (tu, tu).

44
Petr Viktorin

La deuxième ligne aurait dû être pixels[0], avec un S. Vous avez probablement un tuple nommé pixel, et les n-uplets sont immuables. Construisez de nouveaux pixels à la place:

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

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

image.putdate(pixels)
7
Fred Foo

Les tuples, dans python ne peuvent pas avoir leurs valeurs modifiées. Si vous souhaitez modifier les valeurs contenues bien que je vous suggère d'utiliser une liste:

[1,2,3] ne pas (1,2,3)

5
Lewis Norton

Vous voulez probablement la prochaine transformation pour vos pixels:

pixels = map(list, image.getdata())
3
Roman Bodnarchuk

Un tuple est immuable et vous obtenez donc l'erreur que vous avez postée.

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

Dans votre cas spécifique, comme indiqué à juste titre dans d'autres réponses, vous devriez écrire:

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

Vous avez mal orthographié le second pixels sous la forme pixel. Les travaux suivants:

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

Il semble qu'en raison de la faute de frappe vous avez essayé de modifier accidentellement un tuple appelé pixel, et en Python sont immuables. D'où le message d'erreur qui prête à confusion.

0
NPE