西海岸より

つらつらざつざつと

python-fuを使った画像レイヤ情報の取得方法

※Mac OSX snow leopard上で利用

psdファイルでレイヤ化された各画像パーツの座標を取り出したくてgimppython-fuに手を出してみた。
psdファイルとは、フォトショップで作成されたレイヤ等の情報を含むファイルで、gimpでも開くことができる。もともとやりたかったことは、このレイヤ情報をスクリプトでアクセスCSV出力することで、フォトショップでもJavascriptで簡単にできるが、gimpの場合には、pythonrubyなど色々なスクリプトで書くことが可能。

macgimpにはデフォルトでスクリプトpython-fuが組み込まれていたのでこれを利用することにした。
とっかかりとしては、以下のサイトをもとに。

gimpのインストール

python-fuの作成

pluginといえど、python-fuの所定の書き方以外は普通のpythonファイル。各オブジェクトへのアクセス方法など、APIに関しては以下で十分。

以下は、実際に使ったもので、入力ディレクトリ以下のpsdファイルを全て開き、全レイヤの情報をcsvに出力するスクリプト

  • output-layer-position.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gimpfu import *
import itertools, math, os, glob

def do_posout_batch(dirname, outputname):

  if os.path.exists(dirname):
    fnames = glob.glob(dirname+"/*.psd")
   
    new_filename = dirname+"/"+outputname
    fw = open(new_filename, 'w')
    for fname in fnames:
      img = pdb.gimp_file_load(fname, '')

      layers = img.layers
      layers.reverse()
      for layer in layers:
        if layer.name[0] != '$':
          continue
        line = layer.image.name + "," + layer.name[2:] + "," + str(layer.offsets[0]) + ',' + str(layer.offsets[1])
        fw.write(line+"\n")
     
    fw.close()
    pdb.gimp_message("Finished writing to: %s" %(new_filename))
  else:
    pdb.gimp_message("No such directory: %s" %(dirname))

register(
  "output-layer-position",
  "output layer position",
  "output layer position",
  "mmasashi",
  "mmasashi",
  "2011",
  "OutputLayerPosition",
  "RGB*, GRAY*",
  [(PF_DIRNAME, "targetDirectory",  "Target Directory", "."),
  (PF_STRING, "outputName", "Output filename", 'output-data.csv' )],
  [],
  do_posout_batch, menu="<Image>/File")

main()

python-fuの反映方法

  • 作ったpythonファイルを以下に配置。
~/Library/Application Support/Gimp/plug-ins
    • プラグインの配置場所は「編集」->「環境設定」->「フォルダ」で確認や追加が可能


  • gimp上で何か開いた状態で、「ファイル」->「OutputLayerPosition」を選択すると以下の画面が表示される


  • ここで、psdファイルが配置されているディレクトリと、出力csvのファイル名を指定しOKをクリックするとスクリプトが動き、csvを出力してくれる。
  • ちなみに、gimp上で編集中の画像は無関係で、対象ディレクトリのpsdファイルは別途開いて処理されます。