Python: PIL で単一の RGBA カラーを置き換える 質問する

Python: PIL で単一の RGBA カラーを置き換える 質問する

私はすでにこの質問を検討しました:質問ですアルファ値を含む単一の色を置き換えるための非常によく似た手法を実装しているようです。

c = Image.open(f)
c = c.convert("RGBA")
w, h = c.size
cnt = 0
for px in c.getdata():
    c.putpixel((int(cnt % w), int(cnt / w)), (255, 0, 0, px[3]))
    cnt += 1                                                                                                   

しかし、これは非常に遅いです。このレシピインターネット上に公開されていますが、これまで使用して成功したことはありません。

私がやろうとしているのは、白という単色で構成されたさまざまな PNG 画像を取得することです。各ピクセルは 100% 白で、アルファ値 (アルファ = 0 を含む) がさまざまです。基本的にやりたいのは、画像を新しい設定色 (たとえば #ff0000<00-ff>) で色付けすることです。したがって、開始画像と結果画像は次のようになります。左側が開始画像で、右側が終了画像です (注: 背景は実際には透明で左側のドットは見えないため、背景が見えるように明るい灰色に変更されています)。

代替テキスト

これを行うより良い方法はありますか?

ベストアンサー1

NumPy をお持ちの場合は、PIL イメージを操作するためのはるかに高速な方法が提供されます。

例えば:

import Image
import numpy as np

im = Image.open('test.png')
im = im.convert('RGBA')

data = np.array(im)   # "data" is a height x width x 4 numpy array
red, green, blue, alpha = data.T # Temporarily unpack the bands for readability

# Replace white with red... (leaves alpha values alone...)
white_areas = (red == 255) & (blue == 255) & (green == 255)
data[..., :-1][white_areas.T] = (255, 0, 0) # Transpose back needed

im2 = Image.fromarray(data)
im2.show()

編集: 今日は暇な月曜日なので、いくつか例を追加しようと思います。

アルファ値がそのままであることを示すために、アルファ チャネルに放射状グラデーションを適用したサンプル画像のバージョンの結果を次に示します。

オリジナル:代替テキスト

結果:代替テキスト

おすすめ記事