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
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).
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)
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)
Vous voulez probablement la prochaine transformation pour vos pixels:
pixels = map(list, image.getdata())
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])
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.