Подтвердить что ты не робот

Объект 'tuple' не поддерживает назначение элемента

Я использую библиотеку PIL.

Я пытаюсь сделать изображение красным, это то, что у меня есть.

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

Однако я получаю эту ошибку: TypeError: 'tuple' object does not support item assignment

4b9b3361

Ответ 1

Пиковые пиксели являются кортежами, а кортежи неизменяемы. Вам нужно построить новый кортеж. Итак, вместо цикла for выполните:

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

Кроме того, если пиксель уже слишком красный, добавление 20 будет превышать значение. Вероятно, вам нужно что-то вроде min(pixel[0] + 20, 255) или int(255 * (pixel[0] / 255.) ** 0.9) вместо pixel[0] + 20.

И, чтобы иметь возможность обрабатывать изображения в самых разных форматах, сделайте image = image.convert("RGB") после открытия изображения. Метод convert гарантирует, что пиксели всегда (r, g, b) кортежи.

Ответ 2

Вторая строка должна быть pixels[0], с S. У вас, вероятно, есть кортеж с именем pixel, и кортежи неизменяемы. Вместо этого создайте новые пиксели:

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

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

image.putdate(pixels)

Ответ 3

Вероятно, вам понадобится следующее преобразование для вас пикселей:

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

Ответ 4

Кортежи в python не могут изменить свои значения. Если вы хотите изменить содержащиеся значения, я предлагаю использовать список:

[1,2,3] не (1,2,3)

Ответ 5

Вы потеряли вторую секунду pixels как pixel. Следующие работы:

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

Похоже, что из-за опечатки вы пытались случайно модифицировать некоторый кортеж под названием pixel, а в кортетах Python неизменяемы. Следовательно, запутанное сообщение об ошибке.

Ответ 6

Кортеж неизменен, и вы получаете сообщение об ошибке, которое вы разместили.

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

В вашем конкретном случае, как правильно указано в других ответах, вы должны написать:

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