web-dev-qa-db-ja.com

「タプル」オブジェクトはアイテムの割り当てをサポートしていません

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

43
dgamma3

PILピクセルはタプルであり、タプルは不変です。新しいタプルを作成する必要があります。したがって、forループの代わりに、次のようにします。

_pixels = [(pixel[0] + 20, pixel[1], pixel[2]) for pixel in pixels]
image.putdata(pixels)
_

また、ピクセルが既に赤すぎる場合、20を追加すると値がオーバーフローします。 _pixel[0] + 20_の代わりに、おそらくmin(pixel[0] + 20, 255)int(255 * (pixel[0] / 255.) ** 0.9)のようなものが必要でしょう。

また、さまざまな形式の画像を処理できるようにするには、画像を開いた後にimage = image.convert("RGB")を実行します。 convert メソッドは、ピクセルが常に(r、g、b)タプルであることを保証します。

44
Petr Viktorin

2行目はpixels[0]、S付き。おそらくpixelという名前のタプルがあり、タプルは不変です。代わりに新しいピクセルを作成します。

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

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

image.putdate(pixels)
7
Fred Foo

タプル、pythonは値を変更できません。リストを使用することをお勧めしますが、含まれている値を変更したい場合:

[1,2,3] not (1,2,3)

5
Lewis Norton

あなたはおそらくあなたのピクセルのために次の変換が必要です:

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

タプルは不変であるため、投稿したエラーが発生します。

>>> 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])
1
Savino Sguera

2番目のpixelspixelとして間違えています。次の作品:

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

タイプミスにより、誤ってpixelと呼ばれるタプルを変更しようとしており、Pythonタプルは不変です。したがって、混乱を招くエラーメッセージが表示されます。

0
NPE