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

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

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

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

Q&A

解決済

2回答

2270閲覧

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

sum0x0

総合スコア4

Python

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

1グッド

0クリップ

投稿2019/08/14 05:02

編集2019/08/16 01:56

前提・実現したいこと

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

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

該当のソースコード

Python

1from PIL import Image 2 3# 開く 4psd = Image.open("./test.psd") 5 6psd.show()

画像

元画像
イメージ説明

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

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

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

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

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

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

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

tachikoma👍を押しています

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

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

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

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

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

tiitoi

2019/08/14 08:22

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

2019/08/14 08:38

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

回答2

0

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

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

投稿2019/08/22 05:31

編集2019/08/22 05:35
sum0x0

総合スコア4

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

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

0

ベストアンサー

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

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

pip install psd-tools

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

python

1from psd_tools import PSDImage 2 3psd = PSDImage.open("sample.psd") 4print(type(psd)) # <class 'psd_tools.api.psd_image.PSDImage'> 5 6img = psd.compose() # 全レイヤーを結合して、PIL Image 形式で取得する。 7print(type(img)) # <class 'PIL.Image.Image'> 8 9img.save("sample.png")

イメージ説明

追記

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

オンラインツール

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

試した psd ファイル

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

イメージ説明

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

投稿2019/08/14 09:02

編集2019/08/14 09:58
tiitoi

総合スコア21954

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

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

sum0x0

2019/08/14 09:22

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

2019/08/14 10:01

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

2019/08/16 01:58

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

2019/08/16 04:53

photoshop はほとんど使ったことがないのでわからないのですが、背景は透明のままにして、他のレイヤーで今背景レイヤーにあるものを移して同じことを実現することはできないのでしょうか psd-tools 以外にもいくつか Python で psd ファイルを扱えると謳っているライブラリを試しましたが、いずれもうまくいきませんでした。 となってくると、残された選択肢はあまりないかと思います。 ・ なぜアルファチャンネルが保持されないのか psd_tools などのソースコードを見ながらデバッグして直す。(psd ファイルの仕様などの理解が必要) ・ アルファチャンネルが保持されるように背景は透明のままにするなど、元ファイルのほうを変更する。 ・ Python は諦めて他のソフトウェアで対応する。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問