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を追加すると値がオーバーフローします。 _pixel[0] + 20
_の代わりに、おそらくmin(pixel[0] + 20, 255)
やint(255 * (pixel[0] / 255.) ** 0.9)
のようなものが必要でしょう。
また、さまざまな形式の画像を処理できるようにするには、画像を開いた後にimage = image.convert("RGB")
を実行します。 convert メソッドは、ピクセルが常に(r、g、b)タプルであることを保証します。
2行目は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]
not (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])
2番目のpixels
をpixel
として間違えています。次の作品:
pixels = [1,2,3]
pixels[0] = 5
タイプミスにより、誤ってpixel
と呼ばれるタプルを変更しようとしており、Pythonタプルは不変です。したがって、混乱を招くエラーメッセージが表示されます。