#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 кортежи неизменяемы. Отсюда и запутанное сообщение об ошибке.