объект 'tuple' не поддерживает назначение элементов - PullRequest
42 голосов
/ 07 октября 2011

Я использую библиотеку 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

Ответы [ 6 ]

44 голосов
/ 07 октября 2011

PIL-пиксели - это кортежи, а кортежи неизменны.Вам нужно создать новый кортеж.Поэтому вместо цикла 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) кортежами.

7 голосов
/ 07 октября 2011

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

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

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

image.putdate(pixels)
5 голосов
/ 07 октября 2011

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

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

3 голосов
/ 07 октября 2011

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

pixels = map(list, image.getdata())
1 голос
/ 07 октября 2011

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

>>> 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])
0 голосов
/ 07 октября 2011

Вы ошиблись второй pixels как pixel.Следующие работы:

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

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

...