3

同じサイズのpng画像(AとB)が2つあり、2つ目(B)は部分的に透明です。

コードを使用して画像Bを画像Aに貼り付けると

base.paste(overlay, mask=overlay)

私はそれらのほぼ完璧な組み合わせを手に入れました。

しかし、画像Bを画像Aに貼り付ける前に明るくしたいのです。Image.new( "L"、size、80)のようなマスクを使用してみましたが、画像(B)を明るくすることはできますが、画像を暗くすることもできます( A)それは変更してはいけません。

コマンドラインでは、ImageMagickで次のようにやりたいことができます。

composite -dissolve 40 overlay.png base.png result.png

それはまさに私が必要としていることですが、Pythonでこれを行うにはどうすればよいですか?

4

1 に答える 1

5

私自身の理解では、ディゾルブオプションはアルファチャンネルのみを変更します。したがって、アルファチャネルにその値の40%のみを保持させたい場合は、PILでも同じことを行います。

from PIL import Image

overlay = Image.open('overlay.png')
base = Image.open('base.png')

bands = list(overlay.split())
if len(bands) == 4:
    # Assuming alpha is the last band
    bands[3] = bands[3].point(lambda x: x*0.4)
overlay = Image.merge(overlay.mode, bands)

base.paste(overlay, (0, 0), overlay)
base.save('result.png')

このコードでは、画像を複数のバンドに分割します。それらが4つある場合、最後の1つはアルファチャネルを表すと思います。そのため、その値に0.4(40%)を掛けて、ベース画像の上に貼り付ける新しい画像を作成します。

于 2012-12-09T14:47:03.470 に答える