2021年8月22日日曜日

Photoshop CurveファイルをPythonでGIMP用に変換する

 Photoshop Curveファイルを html+JavaScriptでGIMP用に変換するのは、

以前のエントリ

https://momospin.blogspot.com/2021/06/photoshop-curvehtmljavascriptgimp.html

で記事にしました。

今回は、同じことをPythonを使ってやります。


acvファイルのフォーマットは以下のURLを参照 

https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ 


このPythonソースは、GitHubのPhotosop ACVリーダー 

https://gist.github.com/fish2000/5641c3697fa4407fcfd59099575d6938

を元に作成しました。

下のコードをUTF-8のPythonソースファイルに保存してください。




#!/usr/bin/env python
"""

DESCRIPTION:
    PhotoshopのACVファイルをGIMPのトーンカーブに変換する
Usage:
    python acvfile_converter.py acvファイルpath 出力ファイルpath

ORIGINAL CODE AUTHOR:
    fish2000
    https://gist.github.com/fish2000/5641c3697fa4407fcfd59099575d6938

"""

import sys, os, traceback
from struct import unpack

# カーブ1つぶんのデータを読み取る
def read_curve(acv_file):
    curve = []
    # カーブ内のポイント数
    number_of_points_in_curve, = unpack("!h", acv_file.read(2))
    for j in range(number_of_points_in_curve):
        y, x = unpack("!hh", acv_file.read(4))      # ! はビッグエンディアンの意味
        curve.append((x, y))                        # (input, output)をリストに追加
    return curve


def main():
    if (len(sys.argv) != 2):
        acv_file = open(sys.argv[1], "rb")
    else:
        print("Wrong args. Usage: python acv_converter.py acvファイルpath 出力ファイルpath")
        os._exit(1)
    outputFile = sys.argv[2]

    # バージョンとカーブ数を読み取る
    version, nr_curves = unpack("!hh", acv_file.read(4))
    curves = []
    for i in range(nr_curves):
        # カーブ1本ぶんのポイントを読み取る
        curves.append(read_curve(acv_file))

    with open(outputFile,'w',newline="\n") as fo:
        fo.write("# GIMP Curves File\n")

        for curve in curves:
            for p in curve:
                fo.write(f"{p[0]} {p[1]} ")
            rest = 17 - len(curve)
            for i in range(rest):
                fo.write("-1 -1 ")
            fo.write("\n")

if __name__ == '__main__':
    try:
        main()
    except Exception as e:
        print('ERROR, UNEXPECTED EXCEPTION')
        print(str(e))
        traceback.print_exc()
        os._exit(1)


元のコードはRGBの係数を表示する仕様になっているみたいですが、
上のコードは、GIMPのトーンカーブ用ファイルを出力するようにしました。

GIMPのトーンカーブ用ファイルを作成したら、GIMPの画面で
それを読み込んで使います。
その辺は、前のhtml+JavaScript版のエントリで書きました。

0 件のコメント:

コメントを投稿