prevcontentnext

GimpユーザーのためのPerlチュートリアル

著者 Dov Grobgeld

背景

 

Gimpの驚異的な機能の一つに、スクリプトを通して全ての機能にアクセスできるということがあります。これまでは、GimpのほとんどのスクリプトプログラミングはSchemeすなわちScript-Fuで行われてきました。残念ながら、Gimpが提供しているScheme環境は非常に原始的です。例えば、まともなエラーハンドリングを全く提供していません。さらに、ほとんどのユーザーは言語としてのSchemeに不慣れです。そのため、ユーザーの中にはPerlでGimpのスクリプトを書きたい人もいるでしょう。

言語としてのPerlは、Webの読み書きができるユーザにとっては、たぶんより馴染み深いものです。それはCGIを書くために好まれている言語だからです。今では、GimpスクリプトはPerlでも書くことができます。このチュートリアルはGimpのためにそのようなプラグインとスクリプトを書く方法を説明しています。

Perl言語にはすぐれたチュートリアルが幾つもあるので、このチュートリアルは読者がPerlの実際的な知識を持っていると仮定し、Marc Lehmann, pcg@goof.comが書いたPerlモジュールGimpとGimp::FuによってGimpを使用することに主眼を置きます。

必要なもの

 

Perl::Gimpチュートリアルのスクリプトは下記のバージョンでテストされています。

· Gimpバージョン1.04以降、その全ての前提要件を含めて。

· Perlバージョン5.005以降

· perlモジュールGtk、バージョン0.5121以降

· Gimpモジュール、バージョン1.083以降

Perlと全ての関連モジュールはPerl Comprehensive Archive network、つまりCPANからソース形式で入手できます。また、ftp.gimp.orgウェブサイトからRPM形式でダウンロードすることもできます。

Gimpモジュール

 

たいていのスクリプトでは、Gimpモジュールに対してGimp::Fuが提供する、簡便なインターフェースを使います。 Gimp::Fuは、Script-Fuと同様、スクリプトへのパラメータ入力を フレーム風のインターフェースで行うための枠組も提供しますが、スクリプトをコマンドラインからバッチモードで実行することもできます。本チュートリアルは、Gimp::Fuの作成を詳細に扱いますが、 まず最初に、Perl-Fuスクリプトの一般的な枠組を示しておきたいと 思います。

 
 

このスクリプトで注目すべきことは、2つのモジュールGimpとGimp::Fuを使っていること、登録関数、および9行目でGimpモジュールに制御を渡しているその仕方です。

Gimp PDB

 

Gimpで知られている全ての関数は、プロシージャデータベース(PDB)経由で利用できます。これらのPDB関数は、もともとGimp内部にあったものか、プラグインまたはスクリプト拡張によって利用できるようになったものです。登録関数によって登録したPerl関数は、PDBにも現れるでしょう。

Gimpは拡張|DBブラウザで利用できるPDBブラウザを提供しています。このブラウザは、全てのPDB関数を、その入出力パラメータを含めて、見る手段を提供します。gimp_image_newに関するDBブラウザの登録内容は、表 45.1のようです。

表 45.1 Gimp_image_newのPDBエントリ

/名称

gimp-image-new

説明

Creates a new Image with the specified width, height and type

入力

width

INT32

The width of the image


height

INT32

The height of the image


type

INT32

The type of image { RGB (0), GRAY (1), INDEXED (2)}


PDBブラウザの登録内容では、Schemeスタイルのダッシュ文字(-)が 使われていますが、Perlプログラマは、代りにアンダーライン文字(_)を使わなければなりません。大きさ100x150のRGBタイプの新規画像を作成する呼び出しは下のようにります。

$img = gimp_image_new(100, 150, RGB)

先ほどのPDBエントリはgimp_image_newが三つの引数(widthheighttype)を伴って呼び出されることを示しています。全てINT32タイプです。

この規則の例外は、アンダーライン文字の代わりにダッシュで登録されたScript-Fuスクリプトです。これらを呼び出すには、下記の構文を使わなければいけません。

gimp_call_procedure("script-fu-basic1-logo", \
1, "Hello", 10, "Helvetica", [0,0,0],[1,1,1]);

注意:

最初の2つの引数として画像とドローワブルをもつPDB関数を、 Perl::Gimpから呼出すときは、 呼出手順の中で、ドローワブルだけを引数にしなればなりません。

Gimp::Fuと関数の登録

Gimp-FuはScript-Fuに対するPerlの回答です。 これは、Script-Fuと同様、Gtkのインターフェースでスクリプトへのパラメータを渡す簡便な手段を提供していますが、さらに幾つかの付加的な特徴があります。

Gimp-Fuスクリプトの主要な関数は登録関数です。この関数は、スクリプトのGimpに対するインターフェースを宣言します。 登録関数には次の10個のパラメータがあり、全て設定しなればなりません。

1. 関数の名前 -- 文字列。これはPDBに知らせる関数の名前。

2. 簡単な説明 -- 文字列。

3. ヘルプ本文 -- 文字列。

4. 著者名 -- 文字列。

5. スクリプトの著作権 -- 文字列。

6. 作成日付 -- 文字列。

7. メニューパス -- 文字列。パスは下記の二つの書式の一方を持つ。

Xtns|Perl-Fu|スクリプト名

right-click|Perl-Fu|スクリプト名

前者の書式が与えられると、スクリプトはXtns|Perl-Fu配下のメニュー階層に現れる独立実行スクリプトになり、全ての入力をGimp::Fuインターフェイスフレームから受け取ります。後者の書式が与えられると、スクリプトは任意の画像での右ボタンを通してポップアップする画像メニューに結び付けられます。この場合、Gimp::Fuはスクリプトが呼び出された時にアクティブになっていた画像ドローワブルを最初の二つの引数としてスクリプトへ追加します。

8. 受け入れられる画像の種類 -- 文字列。これは受け入れることができる画像の種類のリスト。このフィールドは、右クリックメニュー階層中のスクリプトに対してのみ使われます。 利用できる値は表 45.2の一覧の通り。

表 45.2 利用できる画像の種類


意味

*

全ての画像を受け入れる

RGB

RGB画像

RGBA

アルファチャンネルを持つRGB画像

GREY

グレーレベルの画像


9. パラメータ・リスト -- パラメータの配列への参照。 (Perlにおける配列への参照は、 単に角括弧の中に要素の並びを書いたものです)。 各パラメータは、さらにそれぞれが次の五つの値を持つ配列への参照です。

· 引数の種類。Gimp::FuとPerlによって認識される種類は表 45.3で与えられます。

· 引数の名前-- 文字列

· 引数のヘルプ本文

· 引数のデフォルトの値。これは表 45.3にあげた書式で指定しなればなりません。

· 値の取り得る範囲を定義している配列。これはPF_SLIDERPF_SPINNERだけで利用できます。

表 45.3 PF 値  

種類

利用できる書式

コメント

PF_INT

42

数値: PF_INTはPF_INT32と同義語。

PF_INT32

PF_INT16

PF_INT8

PF_VALUE

3.141

浮動小数値。

PF_FLOAT



PF_BOOLEAN

0

ブール値


1


PF_SLIDER

スライダーとスピンインターフェイスを通した整数値。パラメータの範囲が指定されていなければならず、例えば [0,100,1] のように最小と最大とステップが解釈される。


PF_SPINNER


PF_FONT

-*-blippo-*-*-*-*-24-*-*-*-*-*-*-*

X11フォント形式のフォント。このインターフェイスはフォントブラウザを起動する。

PF_STRING

"A string"

文字列

PF_COLOR

[255,127,0]

色は3要素の配列への参照またはハッシュ記号に続けた16進の三つ組で表わすことが できます。

PF_COLOUR

#ff7f00

PF_TOGGLE

0

ブーリアンのトグル。


1


PF_IMAGE

-

画像

PF_DRAWABLE

-

ドローワブル。

PF_BRUSH


ブラシ。

PF_GRADIENT


グラデーション。

PF_PATTERN


パターン。


10. 11番目のパラメータであるサブルーチンについて、その戻りの型の配列への参照

10. A reference to an array of return types of the sub in the 11th parameter.

11. 呼び出されるサブルーチン -- サブルーチンへの参照。このサブルーチンは、 ステップ7で説明したメニューパスによって 関連するメニューエントリが宣言されている時に呼び出されます。 サブルーチンが呼び出される時、 上記のフィールド9で宣言したパラメータ・リストが引数として渡されます。 特に、右クリックスクリプトの場合には、 アクティブな画像とレイヤーが、第一と第二のパラメータになります。

Perlにおけるサブルーチンへの参照は二つの方法で宣言することができます。 ソースファイルの別の場所でサブルーチンを宣言し (たとえば、sub run)、\&runと書いて参照するか、 次のように、インラインに書くことによります。

sub { ($text, $color) = @_ ; ... }

サブルーチンは、新規の画像を生成したあとで、 それを必ず表示するようには期待されていません。 むしろ、ステップ10で記述した登録呼出の第10パラメータで宣言した 戻りの型に一致するように生成された、新規の画像(複数のこともある)を 返すことを期待されています。 このふるまいは、サブルーチンを非対話的に 呼出すことができるようにするために加えられたものです。

コメント付きスクリプト

次のGimp::Fuスクリプトは前節で説明した手順を例示しています。 これは画像の大きさを引数にとるスクリプトを登録し、それから要求した色で要求した大きさの画像を作成します。はっきり言って役立たずなのですが、スクリプトの登録方法や、新規画像を作成する方法や、PDB関数にアクセスする方法について重要な手順を示しています。


 
 

ここのほとんどのコマンドは、PDBからそのままコピーしたものです。

このスクリプトは独立実行型スクリプトを作成するためにに欠かせない手順を示しています。

· 新規画像を作成する(8行目)。

· 1枚以上のレイヤーを作成する (10行目から11行目)。

· レイヤーを画像に取りつける (13行目)。

· Attaching the layer to the image (line 13).

· レイヤーに対して描画操作を行う (15行目から17行目)。

· 呼出し元に画像を返す (19行目)。

· この拡張機能を登録する (22行目から35行目)。

スクリプトをテストするには、それをディレクトリ$HOME/.gimp/plug-insに保存してからGimpを起動します。Gimpを起動する前にperl -cでスクリプトの構文をテストすることは良い考えです。 (スクリプトを追加するもっとオフィシャルな方法はgimptool --install-binコマンドを使うことです。)

注意: Gimpのバグ(バージョン1.0で確認されている)のため、 Gimpの動作中にスクリプトを追加することはできません。 ただし、パラメータの変更がなければ、 登録済のスクリプトを変更することはできます。

 
 

オブジェクト指向の構文

 

Gimp::Fuは画像やドロアブルのコマンドについて、 オブジェクト指向型の構文を別途提供しています。 次の表はいくつかのコマンドについて、 プロシージャ構文と オブジェクト指向構文を対比させたものです。

表 45.4 OO 構文

プロシージャ構文

オブジェクト指向構文

gimp_image_add_layer($drw,-1);

$img->add_layer($drw, -1);

gimp_drawable_width($drw);

$drw->width();


PDB関数をメソッドへ変換するための置き換え規則は簡単で、 関数呼出しの先頭からgimp_image_を削除し、画像オブジェクトを通してこのメソッドを呼び出すだけです。 gimp_drawable_関数についても同様です。

注意: オブジェクト指向構文は、ある種の場合に呼出し構文をきれいにするための 構文的なお化粧に過ぎません。 エラーメッセージには依然として、手続的な形式しかありません。

選択領域の描画領域

 

uniスクリプトでは画像全体を塗りつぶすために、関数gimp_edit_fillが呼び出されていました。DBブラウザでgimp_edit_fillの情報を見てみると、以下のことが分かります(表 45.5を参照)

表 45.5 gimp_edit_fillのPDBエントリ

Name

gimp-edit-fill

Blurb

Fill selected area of drawable

In

drawable

DRAWABLE

The drawable to fill from


Perl::Fuでは、パラメータとして画像を与える必要はありません。 パラメータ:ドローワブルから自動的に算出されるからです。

gimp_edit_fillが呼び出された時に選択領域がアクティブになっていれば、選択領域だけが描画されます。PDBをselectで検索すれば分るように、 選択領域を選ぶ方法は山ほどあります。 下記の例ではgimp_rect_selectを使用しています。そのPDBの登録内容は次のとおりです。(表 45.6を参照)。

表 45.6 gimp_rect_selectのPDBエントリ

Name

gimp-rect-select

Blurb

Create a rectangular selection over the specified image

In

image

IMAGE

image


x

FLOAT

x coordinate of upper-left corner of rectangle


y

FLOAT

y coordinate of upper-left corner of rectangle


width

FLOAT

the width of the rectangle: width > 0


height

FLOAT

the height of the rectangle: width > 0


operation

INT32

the selection operation: {ADD (0), SUB(1), REPLACE (2), INTERSECT (3) }


feather

INT32

feather option for selections


feather_radius

FLOAT

radius for feather operation


選択領域を描画するスクリプト

この関数の簡単な使用例として、 画像の中央に矩形領域を選択し、その領域をユーザー定義の色で塗りつぶす、 というものを示します。 この例は、いくつか新しい機能も紹介しています。

· メニューパスがright-clickで始まるため、スクリプトは画像で結び付けらている。結果として、13行目のコールバックサブルーチンは二つの追加パラメータ、アクティブ画像と選択したドローワブルを受け取る。

· 登録パラメータとして名無しのサブルーチンを使用しています。

· PDB関数gimp_undo_push_group_startgimp_undo_push_group_endの使用。これらの関数はアンドウグループを宣言する。画像にアンドゥを適用した時、個々の操作をアンドゥする代わりに、アンドゥの開始とアンドゥグループ呼び出しの間の全ての動作が一度でアンドゥされる。

· 登録関数の返り値の種類は、Gimpによって表示される新規画像が何かを定義する。この場合、新規画像を表示して欲しくないので空っぽの配列を返す。



 
 

ループ

Perlでループを書くのは簡単です。 それをさまざまな選択ツールと一緒に使うと、 強力で創造的な可能性が生まれます。 次の例では、円の中で色を混ぜ合せています。 ここには本当に新しいことは何もありませんが、 上記のパワーを示しています。


 
 

文字の作成

 

Hello World -- 画像に文字を書く

文字を作るため、gimp_text_fontname関数を使うことができます。この関数では、フォントはX11フォント規定の書式で指定されます(古い関数 gimp_textgimp_text_extもありますが、 そこでは、個々のX11フォントのフィールドを明示的に指定しなければなりません。

Hello-world1 Perl-Fuスクリプトは"Hello world"の入った画像を作成するスクリプトの例を示しています。


Hello-world1 Perl-Fuスクリプトでは、 X11フォント名からフォントの大きさを抽出する関数 xlfd_sizeを使用しています。 これが必要なのは、gimp_text_fontnameを 書いた人たちが、フォント名の中のフォントサイズを無視するように 決めたからです。

20行目で作成した文字はフローティングレイヤーであり、親レイヤーにアンカーする必要があります。 これは、23行目で、gimp_floating_sel_anchor()を 呼出すことで行われています。

Hello-world1 Perl-Fuスクリプトでは、画像の大きさは文字の大きさとは無関係でした(図 45.5を参照)が、Basic-logo Perl-Fuスクリプトではこのことが考慮されています。 これはロゴ生成スクリプトの基本ステップを示す、より複雑な例になっています。

· 文字列の大きさを抽出する。

· 文字列+境界のサイズで画像を作成する。

· 同じ大きさでドローワブルを作成する。

· 文字を作成してアンカーする。

 
 


 
 


 
 

フローティング選択

 

選択ルーチンの一つを使って範囲を選択するとき、 選択によって囲まれた領域は gimp_edit_copyコマンドによって カットバッファへコピーすることができます。 このカットバッファは、あとで gimp_edit_pasteコマンドによって 別のレイヤーに貼り付けることができます。 レイヤーが貼り付けられるとき、 それはフローティング選択状態になります。 このフローティング選択は gimp_layer_set_offsetsコマンドによって求める位置に移動し、 gimp_floating_sel_anchorコマンドによって 貼り付けることができます。 レイヤーを貼り付ける位置を決めるもう一つの方法は、 カットバッファを貼り付ける前に、 目的の画像に選択領域を作成しておくことです。

このことは、 Horiz-cat Perl-Fu スクリプトに示されています。 それは、もう一つの画像をパラメータとして、ある画像に作用します。 もう一つの画像は、元の画像の右側に連結されます。13行目から28行目にかけて二つの画像がどのように一つの画像へコピーされて糊付けされるのかを示しています。

 
 

Perl Serverと独立実行型スクリプト

 

これまでの全てのスクリプトは、メニューの中のメニュー構造から起動してきました。 しかし、スクリプトは普通のPerlプログラムとして、 コマンドラインから起動することもできます。 このように起動する場合、スクリプトはまず Perlサーバに接続しようとし、 それが失敗すると、自分でGimpを起動しに行きます。 この方法で複数のスクリプトを起動しようとしているなら、 Perlサーバを起動しておく方が速いことは明らかです。 Gimpの起動にはそれなりの時間がかかるからです。 Perlサーバは、Xtnsメニューから起動することができます。

Perl-Fuスクリプトをコマンドラインから起動した結果は、 --outputパラメータを指定できるという点を除いて、 メニューから起動したときと同じです。 --outputパラメータを指定すると、 スクリプトは結果を、 Gimpに表示するのではなく、 ファイルに保存します。

--outputに対するファイル名には、 インターレース、画質因子など、画像保存時の特殊なパラメータを 指定することができます。 詳細は、Gimp::Fuのマニュアルページを参照してください。 その場合でも、画像とファイルタイプに関する通常のルールが依然として 成り立つので、GIFファイルとして保存するには、 それをRGBからインデックス付きのスクリプトに変換しておかなければなりません。 今のところ、この機能は個々のスクリプトに記述しなければなりませんが、 Gimp::Fuの今後の版では、この変換はオプションとして含まれるように なるかもしれません。

次に示すのは、上で宣言したスクリプトを2つの方法で起動したものですが、 出力をJPGファイルとPNGファイルに書き込んでいます。 これらのスクリプトは、画像にインデックス付けを行わないので、 GIFファイルとして保存することはできません。

 
 

このインターフェースだと、Perl-Fuスクリプトで、 perlデバッガを走らせることもできます。

注意: 画像はスクリプトが呼び出されたディレクトリではなく、Gimpが起動されたディレクトリへ保存されます。

Gimp-Perlのためのシェル

Perlサーバを使う場合は、 Gimp::Fuや登録関数の使用は必須ではありません。 そのかわりに、Gimp::Netや、 netという名前のサブルーチンを宣言することができます。 FuなしでGimpを使う、簡単だが強力な例として、 以下に、コマンドラインから起動する 対話的なGimp-Perlシェルを示します。


 
 

次は、このシェルでの対話的なセッションのサンプルです。

 
 

最後の注意、リンクと参考

 

注意

このチュートリアルはスクリプトの書き手が利用できる可能性の一部分だけしかカバーしていません。特に、Gimp::Perlスクリプトを利用する次の論点はカバーされていません。

· カスタム化されたGtkインターフェイスの記述の可能性。

· Perl Data Language(PDL)モジュールを通したタイルデータ操作の完全なデバッグ付きプラグインの記述。

· CGI環境でのPerl::Gimpの使用。

· プラグインのグラデーションで塗りつぶす方法。

· "自由選択"をする方法。

リンクと参考

Marc LehmannsのGimpページhttp://gimp.pages.de

このチュートリアルのオンラインバージョン
http://imagic.weizmann.ac.il/~dov/gimp/perl-tut.html

このチュートリアルがベースにしたSchemeチュートリアル
http://imagic.weizmann.ac.il/~dov/gimp/scheme-tut.html

Gimpのホームページ
http://www.gimp.org

PerlプラグインもあるGimp登録所
http://registry.gimp.org/



 
 

prevcontentnext


Frozenriver Digital Design
http://www.frozenriver.nu
Voice: +46 (0)31 474356
Fax: +46 (0)31 493833
support@frozenriver.com
Publisher Coriolis
http://www.coriolis.com