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

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

ただいまの
回答率

90.33%

Python PIL(Pillow) アルファチャンネル付きのpsd画像がズレる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 85

sum0x0

score 2

前提・実現したいこと

Python PIL(Pillow)でpsdファイルを読み込んで表示されるだけのとても簡単なコードなのですが
psdファイルにアルファチャンネルがある時とない時とで結果が変わってしまいます。
各チャンネルの位置が微妙にズレて表示されます。

なぜこのような現象が起こるのでしょうか
また、ずらさずに表示させる方法はあるのでしょうか?

該当のソースコード

from PIL import Image

# 開く
psd = Image.open("./test.psd")

psd.show()

画像

元画像
イメージ説明

アルファチャンネル無し
イメージ説明

アルファチャンネル有り
イメージ説明

 追記

ご回答いただきありがとうございます。
元画像はPhotoshop上では背景は塗りつぶされており、チャンネルとしてRGBの他にアルファチャンネルを1つ持っている状態です。
回答で頂いたサンプルのpsdデータをこちらも落としてみましたが、それは背景が透明でした。
(元データpsd構造)
![イメージ説明](714cc0093bcd5a3f7611d2a9185f8881.png)

psd-toolsを使用すれば確かにチャンネルのずれは起こらないのですが
背景が透明ではない場合だとアルファチャンネルが無くなってしまいます。

背景色が透明であれば保存し直した時もアルファチャンネルを保持したままであることが判明しました。

(背景を黒で塗りつぶし、tgaに保存し直した画像)
イメージ説明
(背景を透明にし、tgaに保存し直した画像)
イメージ説明

扱っているデータは基本的に背景を透過させていないので
なんとか背景色を塗りつぶしたまま、アルファチャンネルを保持して保存し直せないものでしょうか・・・

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • tiitoi

    2019/08/14 17:22

    その現象が発生する psd ファイルをどこかにアップロードすることは可能でしょうか?
    (teratail だとおそらく psd ファイルを質問欄に添付できない)

    キャンセル

  • sum0x0

    2019/08/14 17:38

    お返事いただきありがとうございます。
    ttp://firestorage.jp/download/d71d2370a3a0db7af4157480d48ffce88a9580ec
    こちらにアップロードしてみました。

    キャンセル

回答 2

checkベストアンサー

0

Pillow は簡易的な psd ファイルの読み込み機能が付属していますが、その psd ファイルはおそらく対応していないのだと思います。

psd-tools というライブラリで読み込めることを確認しました。pip でインストールできます。

pip install psd-tools

以下のようにして、読み込んだあと、PIL 形式に変換できます。

from psd_tools import PSDImage

psd = PSDImage.open("sample.psd")
print(type(psd))  # <class 'psd_tools.api.psd_image.PSDImage'>

img = psd.compose()  # 全レイヤーを結合して、PIL Image 形式で取得する。
print(type(img))  # <class 'PIL.Image.Image'>

img.save("sample.png")

イメージ説明

追記

自分は photoshop を持っていないので、psd ファイル形式についても詳しくないのですが、psd ファイルを編集できる オンラインのエディタ で開いたところ、以下のように background にオブジェクトやアルファマスク?があるようですが、これはどうなっているのでしょうか。

オンラインツール

試しにネットからアルファチャンネル付きの psd ファイルを適当にダウンロードして、上記回答のやり方で PIL に変換してから保存してみましたが、アルファチャンネルは保存後も保持されていました。

試した psd ファイル

アルファチャンネル付きで保存できた psd ファイルは以下のような構造になっていました。

イメージ説明

なので、ご提示いただいたファイルでアルファチャンネルが捨てられてしまうのは、psd ファイルの中身になにか要因があるのではと思いました。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/08/14 18:22

    なるほど、Pillowではうまくpsdは扱えないのですね・・・
    例えばpsd_toolsを使用したとして、別の形式に保存した場合(tgaなど)psdに予め付いていたアルファチャンネルが無くなってしまうのですが
    アルファチャンネルを捨てずに保存する方法はあるのでしょうか?
    重ねての質問となり申し訳有りません。

    キャンセル

  • 2019/08/14 19:01

    すみませんが、原因についてはわからないですが、ご提示の画像だと読み込んだ段階ですでにアルファチャンネルが残っていません。
    ただ psd_tools がアルファチャンネルに対応していないわけではなく、別の psd ファイルで試したところ、アルファチャンネル付きで png で保存できました。
    なので、レイヤーの構造など psd ファイルになにか要因があるのではと思いました。

    キャンセル

  • 2019/08/16 10:58

    お返事遅くなり申し訳有りません。
    どうやら背景色が透明であればアルファチャンネルが保持されるようです(?)
    質問欄に情報を追記しましたので、ご確認いただければ幸いです。

    キャンセル

  • 2019/08/16 13:53

    photoshop はほとんど使ったことがないのでわからないのですが、背景は透明のままにして、他のレイヤーで今背景レイヤーにあるものを移して同じことを実現することはできないのでしょうか
    psd-tools 以外にもいくつか Python で psd ファイルを扱えると謳っているライブラリを試しましたが、いずれもうまくいきませんでした。

    となってくると、残された選択肢はあまりないかと思います。

    ・ なぜアルファチャンネルが保持されないのか psd_tools などのソースコードを見ながらデバッグして直す。(psd ファイルの仕様などの理解が必要)
    ・ アルファチャンネルが保持されるように背景は透明のままにするなど、元ファイルのほうを変更する。
    ・ Python は諦めて他のソフトウェアで対応する。

    キャンセル

0

PILやpsd-toolsで色々調べながら試してみましたがどうもうまくいかないので
NVIDIA Texture Toolsにパスを渡し、変換することで解決できました。
チャンネルが無くなったりズレたりする事の解明にはいたらず、ややモヤっとしますが
やりたいことは出来ているのでこの件はこれで終了します。

アドバイスいただき本当にありがとうございました!

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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