#はじめに
pytoshop の利用に関する記事が少なかったので,PSD形式のファイルに対して各レイヤーの画像を Numpy形式で取り出す方法を共有しておきます.
#やりたいこと
pytoshop というライブラリを使って PSDファイルを読み込み,各レイヤーの画像データを Numpy配列の形式で読み込みます.
そして,全てのレイヤー画像を jpg形式で出力します.
今回は行っていませんが,得られた Numpy配列に操作を加えることで OpenCV による処理を加えることができます.
また,文字化け対策として imwrite関数を定義しておくと良いようです.
同様に imread関数についても,このリンク先に記述があります.
https://qiita.com/SKYS/items/cbde3775e2143cad7455
#スクリプト
#! env python
# -*- coding: utf-8 -*-
import numpy as np
import cv2
import pytoshop
def imwrite(filename, img, params=None):
try:
ext = os.path.splitext(filename)[1]
result, n = cv2.imencode(ext, img, params)
if result:
with open(filename, mode='w+b') as f:
n.tofile(f)
return True
else:
return False
except Exception as e:
print(e)
return False
def main():
read_file_path = 'test.psd'
with open(read_file_path, 'rb') as rfd:
psd = pytoshop.read(rfd)
for i in range(len(psd._layer_and_mask_info._layer_info._layer_records)):
write_file_name = psd._layer_and_mask_info._layer_info._layer_records[i]._name + ".jpg"
# アルファ値は psd._layer_and_mask_info._layer_info._layer_records[i]._channels[-1].image
layer_R = psd._layer_and_mask_info._layer_info._layer_records[i]._channels[2].image
layer_G = psd._layer_and_mask_info._layer_info._layer_records[i]._channels[1].image
layer_B = psd._layer_and_mask_info._layer_info._layer_records[i]._channels[0].image
# image に画像データが含まれており,OpenCV などで加工可能
image = np.stack([layer_R,layer_G,layer_B], axis=2)
imwrite(write_file_name, image)
if __name__ == '__main__':
main()
#参考
pytoshop を利用する上で参考にしたサイトもまとめておきます.
https://qiita.com/mm_sys/items/ba139c9f4dcc0ac38156
https://pytoshop.readthedocs.io/en/latest/api.html