xcfファイルから、pngファイルを作成するのに、gimpfuモジュールを利用する(windows)

目標

gimpのデータファイルxcfファイルから、pngファイルを作りたいと思った。
手動でなくて、スクリプトで行いたい。コマンドライン(cygwinbash)からしたい。
フォルダを指定して、一括で行いたい。

どうもgimpfuでできるらしい。gimpfuは、gimppython向けpython拡張モジュールらしい。
まずは、gimpfuがimportできるようにしてみた。

環境

Windows7 64bit

インストールしたもの

python 2.6.6
http://www.python.org/download/releases/2.6.6/

gimp2.6.11のpython拡張が、2.5と2.6にしか、対応していなかったので。

pygtk-all-in-one-2.24.0.win32-py2.6.msi
http://www.pygtk.org/downloads.html

GTK+ runtime、PyGTK、 PyCairo、PyGObjectを入れるべしとあったが、
上のモジュールで、全部インストールされるぽいので、これを入れる。

gimp2.6.11
http://www.gimp.org/downloads/

"Install now"でなくて、"customize"を押して、進む。
GIMP python extensionにチェックを入れて、インストールする。
必要な条件がそろっていないと、チェックが入れられない。

環境変数を設定

gimpコマンドラインから簡単に実行できるように、
ユーザの環境変数のPATHに、gimpのインストール先を追記しておく。

PATH (もろもろの設定);C:\..(gimpインストール先)..\GIMP-2.0\bin

変換スクリプト作成

これでいいのか、確かめねばなるまい。使ってみるしかない。
幸いなことに具体的な目標がある。

xcf2img.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os.path
from glob import glob

import gimpfu
pdb = gimpfu.pdb

def convert(filename, out_filename):
    img = pdb.gimp_file_load(filename, filename)
    layer = pdb.gimp_image_merge_visible_layers(img, gimpfu.CLIP_TO_IMAGE)

    pdb.gimp_file_save(img, layer, out_filename, out_filename)
    pdb.gimp_image_delete(img)

def run(xcfdir=".", imgdir=".", ext=".png"):
    pathname = os.path.join(xcfdir, "*.xcf")
    for xcf_file in glob(pathname):
        base_name = os.path.basename(xcf_file).rsplit(".",1)[0]
        img_file = os.path.join(imgdir, base_name) + ext

        convert(xcf_file, img_file)
topng.sh
#!/bin/sh
gimp-2.6 -idf --batch-interpreter python-fu-eval -b 'import sys; sys.path=["."]+sys.path;import xcf2img; xcf2img.run("./xcf", "./img", ".png")' -b 'pdb.gimp_quit(1)'

"./xcf" xcfファイルのあるディレクト
"./img" イメージ出力さきのディレクト
".png" イメージの拡張子、今回はpng

実行結果

$ ./topng.sh

(gimp-2.6.exe:2480): LibGimpBase-WARNING **: gimp-2.6.exe: gimp_wire_read(): error
libpng warning: zero length keyword
libpng warning: Empty language field in iTXt chunk
:
:
画像の数続く
;
:
libpng warning: zero length keyword
libpng warning: Empty language field in iTXt chunk
batch command executed successfully

$ 

実行してみると、xcfファイルと同じ数のpngファイルができていた。
ひとつ開くときちんと表示できた。OKのようだ。

エラーと、ワーニングが出ているが、一応さらっと調べて、覚えておいて、
自分に影響がでるまでは、おいておく。つまり保留だ。

考察

手動でgimpで保存したpngファイルと比較すると、ファイルサイズが違っていた。
手動で保存したpngは、色深度24bitで、スクリプトで変換したものは、色深度32bitであった。
ここらへんは、また別途調べたほうがよいと思われる。

追記

この現象、自分に影響があったので、調べた。
convert関数を以下のようにすると、色深度24bitでpngが作成できた。

def convert(filename, out_filename):
    img = pdb.gimp_file_load(filename, filename)
    img.flatten()

    pdb.gimp_file_save(img, img.layers[0], out_filename, out_filename)
    pdb.gimp_image_delete(img)