|
著者 Dov Grobgeld |
背景
| |||||||||||||
|
Gimpの驚異的な機能の一つに、スクリプトを通して全ての機能にアクセスできるということがあります。これまでは、GimpのほとんどのスクリプトプログラミングはSchemeすなわちScript-Fuで行われてきました。残念ながら、Gimpが提供しているScheme環境は非常に原始的です。例えば、まともなエラーハンドリングを全く提供していません。さらに、ほとんどのユーザーは言語としてのSchemeに不慣れです。そのため、ユーザーの中にはPerlでGimpのスクリプトを書きたい人もいるでしょう。 言語としてのPerlは、Webの読み書きができるユーザにとっては、たぶんより馴染み深いものです。それはCGIを書くために好まれている言語だからです。今では、GimpスクリプトはPerlでも書くことができます。このチュートリアルはGimpのためにそのようなプラグインとスクリプトを書く方法を説明しています。 Perl言語にはすぐれたチュートリアルが幾つもあるので、このチュートリアルは読者がPerlの実際的な知識を持っていると仮定し、Marc Lehmann, | |||||||||||||
必要なもの
| |||||||||||||
|
Perl::Gimpチュートリアルのスクリプトは下記のバージョンでテストされています。 · Gimpバージョン1.04以降、その全ての前提要件を含めて。 · Perlバージョン5.005以降 · perlモジュールGtk、バージョン0.5121以降 · Gimpモジュール、バージョン1.083以降 Perlと全ての関連モジュールはPerl Comprehensive Archive
network、つまりCPANからソース形式で入手できます。また、 | |||||||||||||
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は PDBブラウザの登録内容では、Schemeスタイルのダッシュ文字(-)が
使われていますが、Perlプログラマは、代りにアンダーライン文字(_)を使わなければなりません。大きさ100x150のRGBタイプの新規画像を作成する呼び出しは下のようにります。 $img = gimp_image_new(100, 150, RGB) 先ほどのPDBエントリは この規則の例外は、アンダーライン文字の代わりにダッシュで登録されたScript-Fuスクリプトです。これらを呼び出すには、下記の構文を使わなければいけません。
gimp_call_procedure("script-fu-basic1-logo", \ | |||||||||||||
|
注意: 最初の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. メニューパス -- 文字列。パスは下記の二つの書式の一方を持つ。
前者の書式が与えられると、スクリプトは 8. 受け入れられる画像の種類 -- 文字列。これは受け入れることができる画像の種類のリスト。このフィールドは、右クリックメニュー階層中のスクリプトに対してのみ使われます。
利用できる値は表
45.2の一覧の通り。
9. パラメータ・リスト -- パラメータの配列への参照。 (Perlにおける配列への参照は、 単に角括弧の中に要素の並びを書いたものです)。 各パラメータは、さらにそれぞれが次の五つの値を持つ配列への参照です。 · 引数の種類。Gimp::FuとPerlによって認識される種類は表
45.3で与えられます。 · 引数の名前-- 文字列 · 引数のヘルプ本文 · 引数のデフォルトの値。これは表
45.3にあげた書式で指定しなればなりません。 ·
値の取り得る範囲を定義している配列。これは 10. 11番目のパラメータであるサブルーチンについて、その戻りの型の配列への参照 10. A reference to an array of return types of the sub in the 11th
parameter. 11. 呼び出されるサブルーチン --
サブルーチンへの参照。このサブルーチンは、
ステップ7で説明したメニューパスによって
関連するメニューエントリが宣言されている時に呼び出されます。
サブルーチンが呼び出される時、
上記のフィールド9で宣言したパラメータ・リストが引数として渡されます。
特に、 Perlにおけるサブルーチンへの参照は二つの方法で宣言することができます。
ソースファイルの別の場所でサブルーチンを宣言し
(たとえば、
サブルーチンは、新規の画像を生成したあとで、
それを必ず表示するようには期待されていません。
むしろ、ステップ10で記述した登録呼出の第10パラメータで宣言した
戻りの型に一致するように生成された、新規の画像(複数のこともある)を
返すことを期待されています。
このふるまいは、サブルーチンを非対話的に
呼出すことができるようにするために加えられたものです。 コメント付きスクリプト次のGimp::Fuスクリプトは前節で説明した手順を例示しています。
これは画像の大きさと色を引数にとるスクリプトを登録し、それから要求した色で要求した大きさの画像を作成します。はっきり言って役立たずなのですが、スクリプトの登録方法や、新規画像を作成する方法や、PDB関数にアクセスする方法について重要な手順を示しています。 | ||||||||||||
| |||||||||||||
|
ここのほとんどのコマンドは、PDBからそのままコピーしたものです。 このスクリプトは独立実行型スクリプトを作成するためにに欠かせない手順を示しています。 · 新規画像を作成する(8行目)。 · 1枚以上のレイヤーを作成する (10行目から11行目)。 · レイヤーを画像に取りつける (13行目)。 · Attaching the layer to the image (line 13). · レイヤーに対して描画操作を行う (15行目から17行目)。 · 呼出し元に画像を返す (19行目)。 · この拡張機能を登録する (22行目から35行目)。 スクリプトをテストするには、それをディレクトリ | |||||||||||||
|
注意: Gimpのバグ(バージョン1.0で確認されている)のため、
Gimpの動作中にスクリプトを追加することはできません。
ただし、パラメータの変更がなければ、
登録済のスクリプトを変更することはできます。 | ||||||||||||
| |||||||||||||
オブジェクト指向の構文
| |||||||||||||
|
Gimp::Fuは画像やドロアブルのコマンドについて、 オブジェクト指向型の構文を別途提供しています。 次の表はいくつかのコマンドについて、 プロシージャ構文と オブジェクト指向構文を対比させたものです。
PDB関数をメソッドへ変換するための置き換え規則は簡単で、
関数呼出しの先頭から | |||||||||||||
|
注意:
オブジェクト指向構文は、ある種の場合に呼出し構文をきれいにするための
構文的なお化粧に過ぎません。
エラーメッセージには依然として、手続的な形式しかありません。 | |||||||||||||
選択領域の描画領域
| |||||||||||||
|
uniスクリプトでは画像全体を塗りつぶすために、関数
Perl::Fuでは、パラメータとして画像を与える必要はありません。
パラメータ:ドローワブルから自動的に算出されるからです。
選択領域を描画するスクリプトこの関数の簡単な使用例として、
画像の中央に矩形領域を選択し、その領域をユーザー定義の色で塗りつぶす、
というものを示します。
この例は、いくつか新しい機能も紹介しています。 ·
メニューパスが · 登録パラメータとして名無しのサブルーチンを使用しています。 ·
PDB関数 · 登録関数の返り値の種類は、Gimpによって表示される新規画像が何かを定義する。この場合、新規画像を表示して欲しくないので空っぽの配列を返す。 ![]() | |||||||||||||
| |||||||||||||
ループPerlでループを書くのは簡単です。
それをさまざまな選択ツールと一緒に使うと、
強力で創造的な可能性が生まれます。
次の例では、円の中で色を混ぜ合せています。
ここには本当に新しいことは何もありませんが、
上記のパワーを示しています。 | |||||||||||||
| |||||||||||||
文字の作成
| |||||||||||||
Hello World -- 画像に文字を書く文字を作るため、 Hello-world1 Perl-Fuスクリプトは"Hello world"の入った画像を作成するスクリプトの例を示しています。 Hello-world1 Perl-Fuスクリプトでは、
X11フォント名からフォントの大きさを抽出する関数
20行目で作成した文字はフローティングレイヤーであり、親レイヤーにアンカーする必要があります。
これは、23行目で、 Hello-world1
Perl-Fuスクリプトでは、画像の大きさは文字の大きさとは無関係でした(図
45.5を参照)が、Basic-logo
Perl-Fuスクリプトではこのことが考慮されています。
これはロゴ生成スクリプトの基本ステップを示す、より複雑な例になっています。 · 文字列の大きさを抽出する。 · 文字列+境界のサイズで画像を作成する。 · 同じ大きさでドローワブルを作成する。 · 文字を作成してアンカーする。 | |||||||||||||
| |||||||||||||
|
| |||||||||||||
| |||||||||||||
|
| |||||||||||||
| |||||||||||||
フローティング選択
| |||||||||||||
|
選択ルーチンの一つを使って範囲を選択するとき、
選択によって囲まれた領域は
このことは、
Horiz-cat
Perl-Fu スクリプトに示されています。
それは、もう一つの画像をパラメータとして、ある画像に作用します。
もう一つの画像は、元の画像の右側に連結されます。13行目から28行目にかけて二つの画像がどのように一つの画像へコピーされて糊付けされるのかを示しています。 | |||||||||||||
| |||||||||||||
Perl Serverと独立実行型スクリプト
| |||||||||||||
|
これまでの全てのスクリプトは、メニューの中のメニュー構造から起動してきました。
しかし、スクリプトは普通のPerlプログラムとして、
コマンドラインから起動することもできます。
このように起動する場合、スクリプトはまず
Perlサーバに接続しようとし、
それが失敗すると、自分でGimpを起動しに行きます。
この方法で複数のスクリプトを起動しようとしているなら、
Perlサーバを起動しておく方が速いことは明らかです。
Gimpの起動にはそれなりの時間がかかるからです。
Perlサーバは、Xtnsメニューから起動することができます。 Perl-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ページ このチュートリアルのオンラインバージョン このチュートリアルがベースにしたSchemeチュートリアル
Gimpのホームページ PerlプラグインもあるGimp登録所 | |||||||||||||
| 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 |