Объект '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
Ответы
Ответ 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])