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

#python #python-imaging-library

#python #python-imaging-library

Вопрос:

Я использую библиотеку 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. Я уверен, что PIL может просто наложить красный слой на ваше изображение. Если у вас на изображении есть красные пиксели, этот подход не сработает!

Ответ №1:

Пиксели 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) кортежами.

Комментарии:

1. я думаю, что ваше решение больше похоже на мою проблему. Однако, даже если я это сделаю: pixel = (0,0,0). Я получаю точно такую же картинку, что и импортированная.

2. Вы, вероятно, имели в виду min(pixel [0] 20, 255)

Ответ №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:

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

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

Ответ №4:

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

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

Ответ №5:

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

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

Ответ №6:

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

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

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