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

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

ただいまの
回答率

90.33%

  • Python 3.x

    7412questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 255

JoeJack

score 20

 前提・実現したいこと

画像(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
イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2018/05/21 14:22

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

    キャンセル

  • JoeJack

    2018/05/21 15:52

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

    キャンセル

  • can110

    2018/05/21 16:16

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

from PIL import Image

card = Image.open("img.png").convert("RGBA") # 犬
img = Image.open("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")

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

実行結果
イメージ説明

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

from PIL import Image, ImageDraw, ImageFont

# 透過する文字画像を作成
img = Image.new('RGBA', (640,480),(0,0,0,0)) # 適当なサイズの透過画像を生成
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("arial.ttf", 24) # 適当な大きさのフォントで
x,y,max_w = 0,90,0                         # 適当な位置から
DOCS = ['I am a dog.','As yet I have no name.',"I've no idea where I was born."]
for text in DOCS:
    draw.text((x,y), text, fill=(0,0,0), font=font)
    w,h = font.getsize(text)
    max_w = max(max_w, w)
    y += h
img = img.crop((0, 0, max_w, y)) # 画像サイズをテキスト範囲に合わせて調整
img.save('name.png')

# 犬の画像にテキスト画像を重ねる
card = Image.open("img.png").convert("RGBA") # 犬
#img = Image.open("name.png").convert("RGBA") # 文字
x, y = img.size
card.paste(img, (0, 0), img)
card.save("test.png")


イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/21 17:46

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

    キャンセル

  • 2018/05/21 17:56

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

    キャンセル

  • 2018/05/21 19:10

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

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    7412questions

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