62 votes

L'objet "tuple" ne prend pas en charge l'affectation d'éléments.

J'utilise la bibliothèque PIL.

J'essaie de rendre une image plus rouge, voilà ce que j'ai obtenu.

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, je reçois cette erreur : TypeError: 'tuple' object does not support item assignment

57voto

Petr Viktorin Points 13687

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

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

En outre, si le pixel est déjà trop rouge, l'ajout de 20 fera déborder 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 traiter des images dans de nombreux formats différents, faites ce qui suit image = image.convert("RGB") après avoir ouvert l'image. Le site convertir permet de s'assurer que les pixels sont toujours des tuples (r, g, b).

8voto

larsmans Points 167484

La deuxième ligne aurait dû être pixels[0] avec un S. Vous avez probablement un tuple nommé pixel et les tuples 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)

5voto

Lewis Norton Points 1577

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

[1,2,3] no (1,2,3)

3voto

Roman Bodnarchuk Points 12136

Vous voulez probablement la prochaine transformation pour vos pixels :

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

2voto

Savino Sguera Points 2527

Un tuple est immuable et vous obtenez donc l'erreur que vous avez affiché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é correctement dans d'autres réponses, vous devriez écrire :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X