Top > ScriptFuClass > After

CENTER:[[五限目>ScriptFuClass/Step5]] | [[Script-Fu 青空教室>ScriptFuClass]] | [[居残り>ScriptFuClass/Staying]]

---------

*放課後 よく使う Gimp 関数 [#w8e21940]

#contents

ここでは時間外の補習として、Script-Fu を書く上でよく使用する Gimp の関数と、その実際の使用例を見ることができます。set! で変数に入れているところは let* 等で事前に変数を宣言しておく必要があります。


**画像関連 [#b8b0636a]

***新規画像作成 [#j17a8a03]

&aname(gimp-image-new);
>(gimp-image-new 幅 高さ 画像モード)

ピクセルで指定した幅と高さを持つ画像を新規作成し、新しい画像 ID を返します。画像のモードには RGB (0) と GRAY (1) と INDEXED (2) のいずれかを指定することができます。

 (set! new-image (car (gimp-image-new width height RGB)))	; 新規画像を作成

独立実行型スクリプトでは、レイヤーなどを作る前に必ずこの関数を呼び出してレイヤーを設置する画像を作っておく必要があります。上の例では width と height の大きさの RGB 画像を新規作成し、画像 ID を new-image に入れています。

&aname(gimp-display-new);
>(gimp-display-new 画像ID)

新規画像を作成したら、この関数を使って表示するまでディスプレイには現れません。普通、独立実行型スクリプトの場合では一番始めに画像を作成し、全てのスクリプト処理の最後にこの関数を使って画像をディスプレイに出現させます。こうすることで、スクリプト処理の最終結果が表示されるだけになり、途中結果を見せなくて済むようになります。

出力としてディスプレイ ID が返ってきます。ディスプレイ ID は画像ウィンドウの識別番号のようなもので、ディスプレイ上に表示されている画像ウィンドウを消去したい時 (つまり、画像を閉じる時と同じ操作をスクリプトにさせたい時) に gimp-display-delete 関数にとって必要になります。

&aname(gimp-display-delete);
>(gimp-dispaly-delete ディスプレイID)

gimp-display-new 関数を使って表示した画像ウインドウを閉じます。この時、画像も一緒に削除されます。

&aname(gimp-displays-flush);
>(gimp-dispalys-flush)

この関数は、ユーザーインターフェイスに対して行った画像操作を全て更新します。必要な引数は無く、適切な時に呼び出す必要があります。例えば、画像依存型スクリプトを実行した場合、表示を更新することで処理結果をディスプレイに反映させるため、スクリプト処理の最後にこの関数を呼び出すべきです。


***画像の幅と高さ [#q380d212]

&aname(gimp-image-width);&aname(gimp-image-height);
>(gimp-image-width 画像ID)
>
>(gimp-image-height 画像ID)

それぞれ画像 ID を引数として、画像の大きさ (キャンバスサイズ) の幅と高さを返します。

**ドロアブル関連 [#s8b26313]

ドロアブル関連の関数はレイヤーやチャンネルの場合でもドロアブルとして使うことができます。レイヤーやチャンネルなど、画像を描画できるタイプのものがドロアブルです。

***ドロアブルの幅と高さ [#ze5a758e]

>(gimp-drawable-width ドロアブルID)
>(gimp-drawable-height ドロアブルID)

それぞれドロアブル ID を引数として、そのドロアブルの幅と高さを返します。


 (let* ((width (car (gimp-drawable-width layer1)))	; layer1 の幅を width に入れる
        (height (car (gimp-drawable-height layer1)))	; layer1 の高さを height に入れる
        (layer2 (car (gimp-layer-new image width height RGBA-IMAGE "NAME" 100 NORMAL-MODE)))
       )
 )

上の例では layer1 と同じ幅と高さを持つ新しいレイヤー layer2 を作成しています。


***コピーとペースト [#da46d615]

ドロアブルのイメージをコピーして Gimp 内部のバッファに保管し、それを別のドロアブルにペーストします。ペーストした直後はフローティング選択状態になっているので、アンカーして固定します。

 (gimp-edit-copy drawable)	; drawable を Gimp クリップボードにコピー
 
 (gimp-floating-sel-anchor (car (gimp-edit-paste layer 0)))	; layer にクリップボードの中身をペースト
 (gimp-floating-sel-anchor (car (gimp-edit-paste layer 0)))	; クリップボードの中身をペースト

上の場合は、ドロアブル drawable をコピーして layer にペーストしています。gimp-floating-sel-anchor と一緒に使っているので、即座に layer へとペーストされます。

このコピー&ペーストは何のために使うことがあるのかというと、レイヤー画像をチャンネル画像に変換したい場合など、違う種類のドロアブル間のデータを受け渡す場合に使います。


**レイヤー関連 [#mf18239e]


***新規レイヤー作成 [#q7ad7e04]

>(gimp-layer-new 画像ID 幅 高さ レイヤーの種類 レイヤー名 不透明度 レイヤーモード)

ピクセルで指定した幅と高さを持つレイヤーを画像上に作成し、レイヤーの ID を返します。レイヤーの種類には RGB-IMAGE (0) RGBA-IMAGE (1) RGAY-IMAGE (2) GRAYA-IMAGE (3) INDEXED-IMAGE (4) IMDEXEDA-IMAGE (5) のいずれかが入ります (画像のモードとは相反するモードにするとエラーになります)。レイヤー名はレイヤーの名前を文字列で指定します。不透明度は 0 から 100 までの整数を指定します。レイヤーモードはレイヤーの初期モードを指定します。

レイヤーモードで指定できるモードは次の通りです。ただし、後ろ算モード (BEHIND-MODE) はブラシのためのモードであり、レイヤーモードで使用すると自動的に通常の標準モードになります。また、モードの指定時には下記の整数と英語表記の他、 "-MODE" を取り除いた表記もできます (例えば、"NORMAL-MODE" は "NORMAL" としてもよい)。

モード一覧 (※下はレイヤーで使用できるモードではなくて描画モードの一覧です)
|モード名|モード指定|数値指定|h
|標準|NORMAL-MODE|0|
|消算(ディザー合成)|DISSOLVE-MODE|1|
|後ろ|BEHIND-MODE|2|
|乗算|MULTIPLY-MODE|3|
|スクリーン|SCREEN-MODE|4|
|オーバーレイ|OVERLAY-MODE|5|
|差分(差の絶対値)|DIFFERENCE-MODE|6|
|加算|ADDITIONAL-MODE|7|
|減算|SUBSTRACT-MODE|8|
|比較(暗)|DARKEN-MODE|9|
|比較(明)|LIGHTEN-MODE|10|
|色相|HUE-MODE|11|
|彩度|SATURATION-MODE|12|
|色|COLOR-MODE|13|
|明度|VALUE-MODE|14|
|除算|DIVIDE-MODE|15|
|覆い焼き|DODGE-MODE|16|
|焼き込み|BURN-MODE|17|
|ハードライト|HARDLIGHT-MODE|18|
|ソフトライト|SOFTLIGHT-MODE|19|
|微粒取り出し|GRAIN-EXTRACT-MODE|20|
|微粒結合|GRAIN-MERGE-MODE|21|
|色消しゴム|COLOR-ERASE-MODE|22|
|消しゴム|ERASE-MODE|23|
|置き換え|REPLACE-MODE|24|
|逆消しゴム|ANTI-ERASE-MODE|25|





 (set! layer (car (gimp-layer-new image width height RGBA-IMAGE
                                  "NAME" 100 NORMAL-MODE)))	; 新規画像作成

画像 image 上に width x height の大きさを持つ RGBA レイヤーを、レイヤー名 "NAME" で不透明度 100% の通常モードで作り、新しく作ったレイヤーのレイヤー ID を layer に入れています。レイヤーの大きさは必ずしも画像の大きさと一致しなくてもよい (もちろんサイズが違えばはみ出たりします)。背景レイヤーにするつもりがない場合は、レイヤーの種類にアルファチャンネルを持たせるようにします。

&aname(gimp-image-insert-layer);&aname(gimp-image-remove-layer);
>(gimp-image-insert-layer 画像ID レイヤーID 親ID 位置)
>
>(gimp-image-remove-layer 画像ID レイヤーID)

画像にレイヤーを追加します。実際にレイヤー操作をする前にこの命令を実行して、作ったレイヤーと画像とをリンクさせます。親IDは、レイヤーのメイングループにレイヤーを追加するなら 0 を、レイヤーグループの ID を指定します。レイヤーグループについては gimp-layer-group-new を参照のこと。位置は、-1の場合はアクティブなレイヤーの上に配置され、0の場合はレイヤースタックの一番上に配置されます。

&aname(gimp-layer-delete);
>(gimp-layer-delete レイヤーID)
>(gimp-item-delete アイテムID)

指定したレイヤーを削除します。このレイヤーを持っていた画像が既に削除されてしまっているか、画像から既にレイヤーが削除されてる場合、この呼び出しは何も行いません。まだレイヤーを画像に追加していない場合、レイヤーを削除するには gimp-image-layer-remove ではなくこの呼び出しを使います。


&aname(gimp-drawable-has-alpha);
>(gimp-drawable-has-alpha ドロアブルID)

指定したドロアブルにアルファチャンネルがあるかどうかを調べます。レイヤー以外のドロアブルはアルファチャンネルを持たないので、必ず偽 (0) が返ってきます。真 (1) になるのはレイヤーが RGBA GRAYA INDEXEDA のいずれかのタイプである場合だけになります。

***レイヤーのアルファチャンネル [#ka29836b]

&aname(gimp-layer-add-alpha);
>(gimp-layer-add-alpha レイヤーID)

まだアルファチャンネルを持っていなければ、レイヤーにアルファチャンネルを追加します。レイヤーのタイプを RGB から RGBA へ、GRAY から GRAYA へ、INDEXED から INDEXED にします。アルファチャンネルを追加することで、レイヤーをレイヤー階層の一番下から移動したり、レイヤーを透明にしたりすることができるようになります。

 (if (equal? (car (gimp-drawable-has-alpha drawable)) FALSE)		;  αチャンネルが無ければ
     (gimp-layer-add-alpha drawable))		; drawable にαチャンネルを追加

drawable がアルファチャンネルを持っていなければアルファチャンネルを追加するには上のようにします。当然、この場合の drawable はレイヤーでなければなりません。drawable がレイヤーであるかどうかの判別は [[gimp-item-is-layer>#gimp-item-is-layer]] で行います。

&aname(gimp-layer-flatten);
>(gimp-layer-flatten レイヤーID)

レイヤーのアルファチャンネルを削除します。アルファチャンネルを削除する際には、レイヤー上に存在していた透明な領域は背景色とブレンドされます。

**レイヤーマスク関連 [#o93cd270]

***新規レイヤーマスクの作成 [#y6e4ce55]

>(gimp-layer-create-mask レイヤーID マスクタイプ)

レイヤー ID で指定したレイヤーのためのレイヤーマスクを作成し、マスク ID を返します。マスクタイプはレイヤーの初期化方法を指定するもので、ADD-WHITE-MASK (0), ADD-BLACK-MASK (1), ADD-ALPHA-MASK (2), ADD-ALPHA-TRANSFER-MASK (3), ADD-SELECTION-MASK (4), ADD-COPY-MASK (5), ADD-CHANNEL-MASK (6)の7種類があります。白色のレイヤーマスクは完全不透明で、黒色は完全透明で、アルファはレイヤーのアルファチャンネルに応じた透明度 (白黒の濃淡) になります。レイヤーマスクがあるのに新たにレイヤーマスクを追加しようとすると、エラーになります。レイヤーマスクを作成しても、画像に追加されるまでは画像上には現れません。

***レイヤーマスクの追加 [#x0a59b99]

>(gimp-layer-add-mask レイヤーID マスクID)

指定したレイヤーにレイヤーマスクを追加します。レイヤーマスクを追加することで初めて画像に現れます。レイヤーとマスクの両方とも、同じ画像上で作成されたものでなければなりません。

***レイヤーマスクの適用、削除 [#wa9cba18]

>(gimp-layer-remove-mask レイヤーID モード)

指定したレイヤーからレイヤーマスクを取り除きます。レイヤーを取り除く際、レイヤーマスクを適用して取り除くのか (MASK-APPLY (0))、それともレイヤーマスクを適用せずに取り除くのか (MASK-DISCARD (1)) を指定することができます。レイヤーにレイヤーマスクが無かった場合にはエラーになります。


***画像、レイヤーの統合 [#u881f75b]

>(gimp-image-flatten 画像ID)

画像上にある全てのレイヤーを統合し、背景レイヤーを作り、そのレイヤー ID を返します。不可視状態になっていたレイヤーは無視され、そのまま無くなります。統合の時、レイヤーは自動的に画像サイズに切り取られます。


&aname(gimp-image-merge-down);&aname(gimp-image-merge-visible-layers);
>(gimp-image-merge-down 画像ID レイヤーID 結合タイプ)
>
>(gimp-image-merge-visible-layers 画像ID 結合タイプ)

前者はレイヤーをその下のレイヤーと結合して一つのレイヤーにします。後者は可視レイヤーを全て統合します。そのため、後者を呼び出す前にはレイヤーの可視状態を適切に設定しておく必要があります。両方とも、統合によって作られたレイヤーを返します。両方の結合タイプとして、必要に応じて拡大 EXPAND-AS-NECESSARY (0)、画像サイズに切り取り CLIP-TO-IMAGE (1)、最背面レイヤーサイズに切り取り CLIP-TO-BOTTOM-LAYER (2)、の中から選ぶことができます。

 (set! merged-layer (car (gimp-image-merge-visible-layers image EXPAND-AS-NECESSARY)))

関数の返り値は結合した後のレイヤーIDとなることを利用します。


**チャンネル関連 [#cbec4ab1]

チャンネルはドロアブルの一種で、主に選択範囲の加工に使用します。選択範囲の情報を保持するためにも、Gimp 内部ではチャンネルが使われています。これは gimp-image-get-selection でチャンネル ID が返ってくることからも分かります。

***新規チャンネルの作成 [#v36b6a54]

&aname(gimp-channel-new);
>(gimp-channel-new 画像ID 幅 高さ チャンネル名 不透明度 色)

ピクセルで指定した幅と高さを持つチャンネルを画像上に作成します。チャンネル名はチャンネルの名前を文字列で指定します。不透明度は 0 から 100 までの整数を指定します。この不透明度はチャンネルの見え方に影響するのであり、チャンネルの効用には影響しないことに注意。色はチャンネルの色を 0 から 255 までの三色のリストである。この色はチャンネルの見え方に影響するのであり、チャンネルの効用には影響しないことに注意。

 (set! channel (car (gimp-channel-new image width height
                                      "NAME" 50 '(0 127 255))))	; 新規チャンネル作成

画像 image 上に width x height の大きさを持つチャンネルを、チャンネル名 "NAME"、不透明度 50%、チャンネル表示色 '(0 127 255) で作り、新しく作ったチャンネルのチャンネル ID を channel に入れています。

&aname(gimp-image-insert-channel);&aname(gimp-image-remove-channel);
>(gimp-image-insert-channel 画像ID チャンネルID 親ID 位置)	; チャンネルを画像に追加
>
>(gimp-image-remove-channel 画像ID チャンネルID)	; チャンネルを画像から削除

前者はチャンネルを画像に追加します。これを行わないと、チャンネルは Gimp 内部に保持されているだけで画像には追加されず、表示されません。親IDは現行の GIMP バージョンでは未使用なので 0 にします。位置を 0 にするとアクティブなチャンネルの上に新しいチャンネルを追加します。

後者は画像に追加されているチャンネルを画像から削除します。チャンネルが無ければエラーが返ってきます。

&aname(gimp-channel-delete);
>(gimp-channel-delete チャンネルID)		; 古い書式
>(gimp-item-delete アイテムID)		; 現在の書式

指定したチャンネルを削除します。このチャンネルを持っていた画像が既に削除されてしまっているか、画像から既にチャンネルが削除されてる場合、この呼び出しは何も行いません。


**選択範囲 [#q65a97c3]


***選択する、選択しない [#z889be0e]

&aname(gimp-selection-all);&aname(gimp-selection-none);
>(gimp-selection-all 画像ID)	; 全てを選択
>
>(gimp-selection-none 画像ID)	; 全てを非選択状態にする

前者は選択範囲が有った無かったに関わらず、画像の全ての範囲を選択します。後者は選択範囲が有った無かったに関わらず、画像の選択を無くします。


***選択範囲の加工 [#ycf50896]

>(gimp-selection-invert 画像ID)	; 選択範囲の反転
>
>(gimp-selection-glow 画像ID 半径)	; 選択範囲の拡大
>
>(gimp-selection-shrink 画像ID 半径)	; 選択範囲の縮小
>
>(gimp-selection-feather 画像ID 半径)	; 選択範囲の境界ぼかし
>
>(gimp-selection-sharpen 画像ID)	; 選択範囲の境界シャープ化
>
>(gimp-selection-border 画像ID 半径)	; 選択範囲の縁取り

選択範囲の反転では、現在の画像の選択している部分とは反対の、選択されていなかった部分を新たに選択します。選択反転コマンドと同じ働きをし、選択範囲が無かった場合には全てを選択します。

選択範囲の拡大と縮小は、半径で指定したピクセル数に応じて選択範囲の境界を拡大したり縮小したりします。選択範囲の拡大/縮小コマンドと同じ働きをし、選択範囲が無かった場合には何も行いません。半径に負の数を指定するとエラーとなります。

選択範囲のぼかしは、半径で指定されたピクセル数に応じて選択範囲の境界をガウシアンぼかしを使ってぼかします。選択範囲のシャープ化では、ぼやけた選択範囲をシャープにします。選択範囲の境界ぼかしをシャープ化のコマンドと同じ働きをし、選択範囲が無かった場合には何も行いません。

選択範囲の縁取りは、指定した半径で選択範囲の境界を縁取った選択範囲を作成します。新たに作られる、縁取られた選択範囲の境界はぼやけているので、必要であれば選択のシャープ化をしておきます。これは選択範囲の縁取りコマンドと同じ働きをし、選択範囲が無かった場合には何も行いません。


>(gimp-selection-shrink image radius)	; 通常の選択の縮小
>
>(gimp-selection-invert image)		; 選択範囲を反転
>(gimp-selection-grow image radius)	; 選択を拡大
>(gimp-selection-invert image)		; 再び選択範囲を反転

選択範囲を縮小する場合、例えば全てが選択されていた時には Gimp は自動的に画像の境界から選択を縮小します。この時、画像の境界に接する部分は選択を縮小したくない場合、一度選択を反転させてから拡大し、再び選択を反転させて元に戻すという方法があります。

#ref(gimp-selection-shrink-example.png,nolink,選択範囲縮小の例)

上が選択範囲縮小の例です。分かりにくいですが、真ん中の画像の中間に選択範囲があり、上下は非選択状態になっています。これを、半径 15 で縮小したものが左の画像です。画像の右縁から選択範囲が縮小してしまっているのが分かります。一方、右の画像は選択を反転してから拡大して再び反転したものです。縮小ではなく拡大を使ったため、画像の右縁から選択が縮小することがありません。ただし、この方法もどんな場合にも万能であるわけではなく、選択を拡大すると選択の角が半径に応じて丸くなってしまいます。これはこういうものなので、仕方がないと諦めて下さい。


***選択範囲の調査 [#zab63795]

&aname(gimp-selection-value);
>(gimp-selection-value 画像ID X座標 Y座標)

指定した X, Y 座標における選択の値を返します。これは gimp-image-get-selection で取得した ID (選択範囲を表現するために Gimp が内部的に持っているチャンネル ID) を gimp-drawable-get-pixel のドロアブルとして使用した時に相当します (出力されるデータの形式は違っていますが)。


&aname(gimp-selection-is-empty);
>(gimp-selection-is-empty 画像ID)

画像に選択領域があるかどうかを調べます。選択範囲がなければゼロが、選択範囲が有ればゼロ以外の値が返ってきます。

 (if (equal? (car (gimp-selection-is-empty image)) FALSE))
     "Empty"		; 選択領域は無い
     "Existing")	; 選択領域は有る

選択範囲がないことを利用して equal? (数値なので "=" でもよい) を使って FALSE と比較することで、選択領域があった場合と無かった場合の条件分岐を行うことができます。


&aname(gimp-selection-bounds);
>(gimp-selection-bounds 画像ID)

これは画像上にある選択範囲の境界の座標を取得することができます。リストの一番始めは選択領域があるかどうかで、次からは順番に選択範囲の左上 X 座標、左上 Y 座標、右下 X 座標、右下 Y 座標が並んでいます。選択範囲が無かった場合には、各座標には画像の大きさと同一になる左上と右下の座標が入ります。

 (let* (
        (exist? (car (gimp-selection-bounds image))	; 選択領域があるか?
        (bounds (cdr (gimp-selection-bounds image))	; 選択領域の座標リスト
        (x1 (car bounds)		; 左上 X 座標
        (y1 (cadr bounds)		; 左上 Y 座標
        (x2 (caddr bounds)		; 右下 X 座標
        (y2 (cadr (cddr bounds)))	; 右下 Y 座標
       )
 )

(gimp-selection-bounds image) 関数で image 上にある選択範囲の境界の座標を取得しています。一番始めの exist? には、選択範囲がある場合には TRUE が、選択範囲が無い場合には 0 が入ります。次の bounds には選択範囲の座標リスト (左上X座標 左上Y座標 右下X座標 右下Y座標) が入ります。これを x1, y1, x2, y2 で取り出して座標を変数に入れています。これを使用して、選択範囲の大きさを持つレイヤーを作ることができます。


***選択範囲のチャンネルへの保存、読み込み [#x625daae]

&aname(gimp-selection-save);
>(gimp-selection-save 画像ID)

選択範囲をチャンネルに保存し、選択を保存したチャンネルの ID を返します。選択領域の情報を持ったチャンネルが新たに作られ、自動的にチャンネルに追加されます。そして選択を保存したチャンネルがアクティブになります。選択範囲が画像に存在しない場合にもこのプロシージャは実行され、全体が黒色のチャンネルが作られます。この機能は選択をチャンネルに保存するコマンドと同様のものです。

&aname(gimp-selection-load);
>(gimp-selection-load チャンネルID)
>(gimp-image-select-item 画像ID 操作タイプ アイテムID)

指定したチャンネルのデータから選択範囲を作成します。この機能を使う前にあった選択範囲は破棄され、読み込まれたチャンネルから新たな選択範囲を作成します。チャンネルの情報に基いて選択範囲が作成されるため、選択範囲にしたいチャンネルの大きさは画像の大きさと同じでなければなりません。大きさが一致しない場合、エラーになります。


**フローティング選択 [#g00c15c0]

フローティング選択は、Gimp 上ではレイヤーとして扱われています。フロート ID がレイヤー ID と同じであることは gimp-floating-sel-to-layer によっても分かります。

***フローティング選択の作成 [#s9896a5a]

&aname(gimp-selection-float);
>(gimp-selection-float ドロアブルID オフセットX オフセットY)


選択範囲にあるドロアブルをフローティング選択にし、フロート ID が返ってきます。つまり、選択範囲をフロート化します。この時、選択範囲の中にあるドロアブル上のイメージはカットされ、フローティング選択になります。オフセットの値を指定することで、フロート化した時にフローティングレイヤーの位置をずらすことができます。選択領域が無かった場合にはエラーになります。

&aname(gimp-floating-sel-attach);
>(gimp-floating-sel-attach レイヤーID ドロアブルID)

レイヤーをドロアブル上のフローティング選択にします。フローティング選択として使用するレイヤーと、そのフローティング選択を取り付けるドロアブルの二つを引数にします。この後、レイヤー ID がフロート ID として使用できます。


***フローティング選択の固定、レイヤーへの変換、削除 [#rb31ed05]

&aname(gimp-floating-sel-anchor);
>(gimp-floating-sel-anchor フロートID)


指定したフローティング選択を、そのフローティング選択が存在しているレイヤーに固定します。この操作により、画像からフローティング選択は無くなります。もとのフローティング選択領域のレイヤーのタイプが何であれ、自動的に固定するレイヤーのタイプに変換されます。

&aname(gimp-floating-sel-to-layer);
>(gimp-floating-sel-to-layer フロートID)

フローティング選択を新たなレイヤーに変換します。この関数によりフローティング選択は、フローティング選択と同じ大きさと幅とオフセットを持ったレイヤーになります。この操作の後、フローティングレイヤーから作成されたレイヤーがアクティブなレイヤーになります。チャンネルやレイヤーマスク上にフローティング選択があった場合、レイヤーとはベースタイプが異なるためこの操作は無効になります。

&aname(gimp-floating-sel-remove);
>(gimp-floating-sel-remove フロートID)

固定等をすることなく、フローティング選択を完全に削除します。実行後は、フローティング選択を作る以前にアクティブになっていたドロアブル (つまり、フローティング選択を作り出したドロアブル) がアクティブになります。


フローティング選択の調査

&aname(gimp-image-floating-sel-attached-to);
>(gimp-image-floating-sel-attached-to 画像ID)

画像上にあるフローティング選択が取り付けられているドロアブル ID を返します。もしフローティング選択が無かった場合には -1 を返します。

&aname(gimp-image-floating-selection);
>(gimp-image-floating-selection 画像ID)

画像上に存在するフローティング選択の ID を返します。画像上にフローティング選択が無かった場合、-1 を返します。とりあえず画像上に存在するフローティングレイヤーを固定したいのだという場合、この関数を car したものを gimp-floating-sel-anchor に渡すことで実現することができます。

 (gimp-floating-sel-anchor (car (gimp-image-floating-selection image)))	; フローティングレイヤーを固定する
 (gimp-floating-sel-anchor
       (car (gimp-image-floating-selection image)))	; フローティングレイヤーを固定する


**色やパターンなどを元に戻す [#g3360cde]


*** コンテキスト全体 [#context]

>(gimp-context-pop)	; 現在のコンテキストをコンテキストスタックに入れる
>
>(gimp-context-push)	; コンテキストスタック内のコンテキストを読み込む

主な使い方は、スクリプト文の開始直後にコンテキストを保存時、終了直前にコンテキストを戻すということです。

現時点でコンテキストとして取り扱われるものは、背景色、描画色、ブラシ、フォント、グラデーション、不透明度、描画方法、描画モード、パレット、パターンです。

*** ブラシ [#context-brush]

 (set! old-brush (car (gimp-context-get-brush)))	; 現在アクティブなブラシを取得
 
 (gimp-context-set-brush old-brush)	; ブラシを変更


前者は現在アクティブになっているブラシの名前を old-brush に入れています。後者はアクティブなブラシを old-brush で与えたブラシに変更しています。

*** グラデーション [#context-gradient]

 (set! old-gradient (car (gimp-context-get-gradient)))	; グラデーションを取得
 
 (gimp-context-set-gradient old-gradient)	; グラデーションを変更

前者は現在アクティブになっているグラデーションの名前を old-gradient に入れています。後者はアクティブなグラデーションを old-gradient で与えたグラデーションに変更しています。

*** 前景色/背景色 [#context-fgbgcolor]

 (set! old-fg (car (gimp-context-get-foreground)))	; 現在の前景色を取得
 (set! old-bg (car (gimp-context-get-background)))	; 現在の背景色を取得
 
 (gimp-context-set-foreground old-fg)	; 前景色を変更
 (gimp-context-set-background old-bg)	; 背景色を変更

前者は現在アクティブになっている前景色と背景色を old-fg と old-bg に入れています。後者はアクティブな前景色と背景色を old-fg と old-bg で与えた色に変更しています。

*** パターン [#context-pattern]

 (set! old-pattern (car (gimp-context-set-pattern)))	; 現在アクティブなパターンを取得
 
 (gimp-context-set-pattern old-pattern)	; アクティブなパターンを変更

前者は現在アクティブになっているパターンの名前を old-pattern に入れています。後者はアクティブなパターンを old-pattern で与えたパターンに変更しています。

*** 描画色の交換 [#context-swap]

 (gimp-context-swap-colors)	; 現在の描画色と背景色を入れ替える


**塗りつぶし [#m33eb72a]

***前景/背景/透明塗り [#bdb73cab]

Gimp にはドロアブルに対して (つまり、レイヤー以外のチャンネルやレイヤーマスクに対しても) 塗りを行うことができます。普通の塗りでも何通りかの方法があります。塗りつぶしのタイプには、前景色塗り FG-IMAGE-FILL (0) 背景色塗り BG-IMAGE-FILL (1) 白色塗り WHITE-IMAGE-FILL (2) 透明塗り TRANS-IMAGE-FILL (3) 塗りつぶし無し NO-FILL (4) の中から一つを選びます。色で塗りつぶす場合は、予め前景色や背景色を [[gimp-palette-set-foreground>#gimp-palette-set-foreground]] 関数を使って変更しておかなければいけません。透明で塗りつぶす場合、ドロアブルがアルファチャンネルを持っていなければ白で塗りつぶされます。


&aname(gimp-edit-fill);
>(gimp-edit-fill ドロアブルID 塗りタイプ)


これは指定したドロアブルを指定した塗りつぶし方法で塗りつぶします。画像に選択範囲があった場合、選択範囲の中だけに対して塗りつぶしを行います。選択範囲がなければ、ドロアブル全体に対して塗りつぶしを行います。

&aname(gimp-drawable-fill);
>(gimp-drawable-fill ドロアブルID 塗りタイプ)


これは指定したドロアブルを指定した塗りつぶし方法で塗りつぶします。画像に選択範囲が有ろうが無かろうが関係無く、選択を無視して指定したドロアブル全体を塗りつぶします。そのため、ドロアブルを初期化するために使用するとよいでしょう。例えば、レイヤーを新しく作った場合、そのレイヤーはまだ初期化されていないのでランダムな模様が入っていることが有ります。これを取り除くためにもレイヤーを新規作成したら必ず初期化するようにしておきます。

 (set! new-layer (car (gimp-layer-new image width height RGBA_IMAGE "NewLayer" 100 NORMAL)))
 (gimp-image-insert-layer image new-layer 0 -1)	; レイヤーを画像に追加
 (gimp-drawable-fill new-layer TRANS-IMAGE-FILL)	; 透明でレイヤーを初期化



***前景/背景/パターン塗り [#d24f4c31]

&aname(gimp-edit-bucket-fill);
> (gimp-edit-bucket-fill ドロアブルID 塗りタイプ 塗りモード 不透明度 閾値 レイヤー結合 X座標 Y座標)


これは Gimp ツールの塗りつぶしと同じもので、前景/背景塗りの他、パターン塗りを行うことができます。塗りつぶしの際、指定した X-Y 座標から指定した閾値内にある範囲に対して塗りつぶしを行います。選択範囲が有れば、選択範囲によって塗りつぶしの範囲を制限することができます。これは [[gimp-edit-fill>#gimp-edit-fill]] や [[gimp-drawable-fill>#gimp-drawable-fill]] とは違い、塗りつぶし時の不透明度や塗りモードを指定することができます。


** アンドゥ [#undo]

*** アンドゥスタックのグループ化 [#gimp-image-undo-group]

> (gimp-image-undo-group-start 画像ID)
> 
> (gimp-image-undo-group-end 画像ID)

start から end に囲まれた間の (アンドゥ可能な) 複数の処理を一つのアンドゥグループにまとめます。start した場合、スクリプトの終わりのほうで必ず end しておく必要があります。


*** アンドゥの無効化/解除 [#gimp-image-undo-enable]

> (gimp-image-undo-disable 画像ID)
> 
> (gimp-image-undo-enable 画像ID)

gimp-image-undo-disable を呼び出すと、それ以降のアンドゥ可能な処理であってもアンドゥスタックに記憶されません。gimp-image-undo-enable を呼び出すと、これより後では通常通りアンドゥ可能な処理はアンドゥスタックに入ります。これにより、enable を呼び出した直後の状態からアンドゥをすると disable を呼び出す直前の状態に戻ることができます。


*** アンドゥの確認 [#gimp-image-undo-is-enabled]

 (set! enabled? (car (gimp-image-undo-is-enabled image)))

gimp-image-undo-disable や gimp-image-undo-freeze を呼び出しているときでは、その間はアンドゥ可能な処理であってもアンドゥスタックには記憶されません。そのような状態になっているのかどうかを判別する関数です。状態により、TRUE もしくは FLASE が返ってきます。アンドゥ可能かどうかをチェックする必要があるスクリプトのときに使用します。


-----

TODO

-delete
-%%undo%%
-%%selection%%
-%%floating-sel%%
-path
-%%layer%%
-%%layer-mask%%
-%%channel%%
-brush, gradient, pattern
-状態判別、タイプ取得 *-is-*

-----

CENTER:[[五限目>ScriptFuClass/Step5]] | [[Script-Fu 青空教室>ScriptFuClass]] | [[居残り>ScriptFuClass/Staying]]

Backup   RSS of recent changes