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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4130閲覧

透明ピクセルの貼付けをしたい

hokosugi

総合スコア63

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/05/20 23:35

編集2018/05/21 06:56

前提・実現したいこと

画像(card)に画像(img)を透過させて貼り付けたい。

発生している問題・エラーメッセージ

透過出来ずに貼り付けられる。

from PIL import Image card = Image.open("C:\Users\user\documents\img.png").convert("RGBA") img = Image.open("C:\Users\user\documents\name.png").convert("RGBA") print(card.mode, img.mode) #card,img=="RGBA" print(card) print(img) #both variable are Image object x, y = img.size card.paste(img, (0, 0, x, y), img) card.save("test.png", format="png")

疑問点・確認点

貼り付けられる元画像と貼り付ける画像の両画像のピクセル値がRGBAタイプならpaste()メソッドの第3引数に第1引数
を充てると透過を反映してくれると思いますが上記のコードでは実現出来ません。
確認したこと---
・変数card,imgともImageオブジェクトであること
・両変数ともピクセル値は"RGBA"であること
・試行錯誤中にJPEGではマスクImageオブジェクトに対応していないエラーメッセージを見たのでPNG形式にしたこと

上記以外で確認していない箇所はあるでしょうか?

画像(追加)

変数card
イメージ説明
変数img
イメージ説明
実行後の変数card
イメージ説明

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

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

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

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

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

can110

2018/05/21 05:22

差支えない範囲で元画像(card、img)、欲しい画像、現在の(問題のある)結果画像を提示ください。
hokosugi

2018/05/21 06:52

画像を追加で貼り付けました。imgはImageDrawメソッドでtextを書き込んでいます。あくまでサンプルですので画像自体に意味はありません。
can110

2018/05/21 07:16

追記ありがとうございます。元画像に問題があると思われます。
guest

回答1

0

ベストアンサー

文字の画像name.pngが透過イメージになっていないようです。
ペイントソフト(GIMP)で透過するように編集すると、正常に動作しました。

Teratailへの画像アップロード時に不透明な画像に変換された可能性もありますので
回答者様の環境でアップ元画像を確認ください。

Python

1from PIL import Image 2 3card = Image.open("img.png").convert("RGBA") # 犬 4img = Image.open("name.png").convert("RGBA") # 文字 5 6print(card.mode, img.mode) #card,img=="RGBA" 7print(card) 8print(img) #both variable are Image object 9x, y = img.size 10card.paste(img, (0, 0, x, y), img) 11card.save("test.png", format="png")

透過するようにGIMPでname.pngを編集
イメージ説明

実行結果
イメージ説明

Pythonコードで透過する文字画像を作成し、重ねて描画するサンプルを書いてみました。

Python

1from PIL import Image, ImageDraw, ImageFont 2 3# 透過する文字画像を作成 4img = Image.new('RGBA', (640,480),(0,0,0,0)) # 適当なサイズの透過画像を生成 5draw = ImageDraw.Draw(img) 6font = ImageFont.truetype("arial.ttf", 24) # 適当な大きさのフォントで 7x,y,max_w = 0,90,0 # 適当な位置から 8DOCS = ['I am a dog.','As yet I have no name.',"I've no idea where I was born."] 9for text in DOCS: 10 draw.text((x,y), text, fill=(0,0,0), font=font) 11 w,h = font.getsize(text) 12 max_w = max(max_w, w) 13 y += h 14img = img.crop((0, 0, max_w, y)) # 画像サイズをテキスト範囲に合わせて調整 15img.save('name.png') 16 17# 犬の画像にテキスト画像を重ねる 18card = Image.open("img.png").convert("RGBA") # 犬 19#img = Image.open("name.png").convert("RGBA") # 文字 20x, y = img.size 21card.paste(img, (0, 0), img) 22card.save("test.png")

イメージ説明

投稿2018/05/21 07:16

編集2018/05/21 08:55
can110

総合スコア38262

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

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

hokosugi

2018/05/21 08:46

ありがとうございました。早速GIMPインストールして実行して出来ること確認しました。めっちゃ嬉しいです!!「退屈なことはpythonにやらせよう」に従って進めましたが躓いてどうしようかと途方にくれてました。改めてお礼申します。
can110

2018/05/21 08:56

解決してよかったです。 ついでに透過するテキスト画像を作成するコード例を追加しました。参考まで。
hokosugi

2018/05/21 10:10

なるほど、フォントサイズで座標を返してリストに格納された文字列を張り付けていくのですね。縦横無尽にコードを操る自由な感じが面白いです。 写経して自分のものにしときます。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問