質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4261閲覧

pillow で 透過画像を リサイズ、透明化すると背景が透過しなくなってしまう

hgdfgs

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/08 22:48

リサイズから不透明度処理までを消すと透過されるのですが、この処理を入れるとimageの透過部分が黒く見えてしまいます。
処理をした画像の透過を維持するにはどうすればよいのでしょうか?

python

1from PIL import Image 2 3back = Image.open(背景).convert('RGBA') 4image = Image.open(透過画像).convert('RGBA') 5 6back.resize((1000,1000)) 7image.thumbnail((100,100)) 8image.putalpha(100) 9 10image_clear = Image.new('RGBA',back.size,(255,255,255,0)) 11back.paste(image,(50,50),image) 12back = Image.alpha_composite(back,image_clear) 13 14back.show()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

貼り付ける画像がすでに透過 png になっているなら、putalpha() は不要です。
img.paste(watermark, (50, 50), watermark) でそのまま貼り付ければよいです。

python

1from PIL import Image 2 3img = Image.open("sample.jpg").convert("RGBA") 4watermark = Image.open("watermark.png").convert("RGBA") 5 6# 必要であれば、ウォーターマークをリサイズする 7watermark.thumbnail((500, 500)) 8 9# ウォーターマークを貼り付ける 10img.paste(watermark, (50, 50), watermark) 11img

イメージ説明

追記

このサイトの4番目のように透過画像の不透明度を操作したかったのですがうまくいきませんでした。

であれば、putalpha() で一律にアルファチャンネルを同じ値にすると、透明だった画素まで変更されてしまうため駄目です。
アルファチャンネルが0でない画素のみ、アルファチャンネルを変更するという条件分岐が必要です。
こういう操作は numpy のほうが楽なので、一旦 numpy にしてアルファチャンネルが0でない画素だけ変更したあと、また PIL.Image に戻せばよいと思います。

python

1from PIL import Image 2 3img = Image.open("sample.jpg").convert("RGBA") 4watermark = Image.open("watermark.png").convert("RGBA") 5 6# 必要であれば、ウォーターマークをリサイズする 7watermark.thumbnail((500, 500)) 8 9# numpy のほうが操作しやすいので、numpy に一旦する 10watermark = np.array(watermark) 11alpha = 30 # 変更後のアルファチャンネルの値 12watermark[watermark[..., 3] != 0, 3] = alpha 13watermark = Image.fromarray(watermark) 14 15# ウォーターマークを貼り付ける 16img.paste(watermark, (50, 50), watermark) 17img

イメージ説明

投稿2020/09/10 03:07

編集2020/09/10 04:18
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hgdfgs

2020/09/10 04:08

返信ありがとうございます。 https://pybit.es/pillow-intro.html このサイトの4番目のように透過画像の不透明度を操作したかったのですがうまくいきませんでした。
tiitoi

2020/09/10 04:18

追記しました。
guest

0

putalpha(100) は画像全体のアルファチャンネルの値を100に設定して半透明にするという処理なので、アルファチャンネルで見えなくなっていた色がうっすら見えるようになります。
もともと (0, 0, 0, 0) で色が黒でアルファチャンネルの値が0で透明となっていたのを、黒色が見えるようになるのは意図通りの結果と思います。

処理をした画像の透過を維持するにはどうすればよいのでしょうか?

透明だった画像が半透明になってしまったということはもともと透過画像だったと思いますが、``putalpha(100)` はどのような意図でいれたのでしょうか?

投稿2020/09/09 14:50

編集2020/09/09 15:22
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hgdfgs

2020/09/09 20:38

返信ありがとうございます。 透過画像を使ってウォーターマークのような透かしを入れたかったので、putalphaを入れました。 透過画像の透過されていない部分だけを半透明にしたかったのですが、そういった処理をするにはどうすればよいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問