簡體   English   中英

'tuple'對象不支持項目分配

[英]'tuple' object does not support item assignment

我正在使用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

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") ,請在打開圖像后執行image = image.convert("RGB") convert方法將確保像素始終為(r,g,b)元組。

第二行應該是pixels[0] ,帶有S.你可能有一個名為pixel的元組,元組是不可變的。 改為構造新像素:

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

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

image.putdate(pixels)

python中的元組不能改變它們的值。 如果您想更改包含的值,我建議使用列表:

[1,2,3]不是(1,2,3)

您可能希望為您的像素進行下一次轉換:

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

元組是不可變的,因此您會收到您發布的錯誤。

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

您將第二個pixels拼錯為pixel 以下作品:

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

看來,由於拼寫錯誤,你試圖意外地修改一些名為pixel元組,而在Python中,元組是不可變的。 因此令人困惑的錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM