Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What is going on with this article?
@mm_sys

pythonでPhotoshop形式のファイル(.psd)を作る

More than 1 year has passed since last update.

screen.png

pytoshopというライブラリを使ってPSDファイルを作ります。
pytoshopで一旦psdファイルを読み込んで加工するのは結構他でも見つかりましたが、ゼロから作るのは見当たらなかったので公式ドキュメントみたりデバッグしなりしながら調べてみました。

基本的にPythonで一般的なOpenCVの画像データ(numpy配列)でレイヤーを構成して書き出す感じです。

必要なパッケージのインストール

pip install numpy scipy opencv-python Pillow six psd-tools3 pytoshop

スクリプト

main.py
#! env python
# -*- coding: utf-8 -*-

import os
import sys
import cv2
import pytoshop
from pytoshop import layers
import numpy as np
import cv2

def main():
    # レイヤー用画像
    test_img = cv2.imread("test1.tif")
    #
    # 白紙のPSDファイルを作る
    #
    psd = pytoshop.core.PsdFile(num_channels=3, height=test_img.shape[0], width=test_img.shape[1])
    # 255埋めの画像を作る(透明度用)
    max_canvas = np.full(test_img.shape[:2], 255, dtype=np.uint8)
    #
    # レイヤーを作る
    #
    # 必要なレイヤーの枚数分行う
    # 透明度 np.ndarray([], dtype=np.uint8)
    # 255が不透明、0が透明になっており、グレースケールのマスク画像を設定することで、透明度を持ったレイヤーを作ることが出来る
    layer_1 = layers.ChannelImageData(image=max_canvas, compression=1)
    # RGB
    layer0 = layers.ChannelImageData(image=test_img[:, :, 2], compression=1)  # R
    layer1 = layers.ChannelImageData(image=test_img[:, :, 1], compression=1)  # G
    layer2 = layers.ChannelImageData(image=test_img[:, :, 0], compression=1)  # B
    new_layer = layers.LayerRecord(channels={-1: layer_1, 0: layer0, 1: layer1, 2: layer2},  # RGB画像
                                   top=0, bottom=test_img.shape[0], left=0, right=test_img.shape[1],  # 位置
                                   name="layer 1",  # 名前
                                   opacity=255,  # レイヤーの不透明度
                                   )
    psd.layer_and_mask_info.layer_info.layer_records.append(new_layer)
    #
    # 書き出し
    #
    with open("output.psd", 'wb') as fd2:
        psd.write(fd2)
    return


if __name__ == '__main__':
    main()

10
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
mm_sys
deepoculus
ツカザキ病院眼科のAIチームです。医療AI(特に眼科領域)の開発を行うスタートアップ

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
10
Help us understand the problem. What is going on with this article?