ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

GIMPコミュのScript-Fu

  • mixiチェック
  • このエントリーをはてなブックマークに追加
GIMPの特徴として挙げられるマクロ実行機能ですが
記述言語がschemeという一般的なプログラミング言語のリストにはあがってこない言語の習得が必要など
多少の壁があるようです。

使い始めると意外にschemeは使いやすいと私は思いますが
そうしたScript-Fu関係話題はいかがでしょうか?

チュートリアル日本語訳
http://www004.upp.so-net.ne.jp/iccii/project/trans/script-fu/script-fu-tut.html

あと、
よく比べられるPhotoShopではアクションという機能でGUI上の操作を記録再生する機能がついているのですが
こちらはこちらでCUIでGIMPの機能が使えると考えれば便利なものだと思います。
でもGUIで作成できると初心者には優しいと思うんですけどね。

他にもPerl-FuとかPython-Fuとか存在しますが実行環境を整える時点で挫折しました。

コメント(8)

とりあえず言語としてのSchemeを勉強すると違うかもしれません。
http://ja.wikipedia.org/wiki/Scheme

Schemeのリンク集?
http://www.sci.u-toyama.ac.jp/~iwao/Scheme/scheme.html

この言語の実行環境としてGimpがあって
さらにその使用可能な関数にGimpの各機能がある
といった感じです。
GIMPは長いこと使ってたのですが、今日いきなりScript-Fu組もうと思い立ちました。
んでwikiの青空教室やGoogleで出てきたサンプルスクリプトなど参考にこんなの組んだのですが、エラーにはならないものの、まったく何も起こらないということになって途方にくれてます。
何か必要事項が抜けてますでしょうか。
やりたいことは、画像全体512x512に縮小→決め打ちの名前つけてTGA無圧縮保存、これだけです。
縮小値をいろいろにしたり名前をいろいろにしたるするのは将来追加したいと考えてます。

以下Scriptコード

define (script-fu-SSCscale img layer )
(let* (
(save-file-name nil)
(set! save-file-name "SSC512.tga")
(gimp-image-set-filename img save-file-name)
(gimp-image-scale img 512 512)
(gimp-displays-flush)
(file-tga-save TRUE img layer (car (gimp-image-get-filename img)) (car (gimp-image-get-filename img)) FALSE 1)
(gimp-image-clean-all img)
));end of let
);end of define

(script-fu-register
"script-fu-SSCscale" ;Script name
"<Image>/Script-Fu/SSCscale" ;Menu
"Scale Image " ;Description
"nanashi" ;Creater
"copyright 2012, nanashi"
;copyright notice
"Jan 26, 2012" ;date created
"RGB*, GRAY*, INDEXED*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
);end of register
> 2 western@悪ノ召使 さん
Schemeを使ったことは全くありませんでしたが調べて見ました。
そうすると、このScriptが動かない原因はlet*の使い方が悪いことに気が付きました。

(let* (変数定義) 処理) なので、
変数定義に書いて良いのはこのScriptの場合、(save-file-name nil)だけです。
それ以外はすべて処理に書かなければなりません。

その結果、GIMP 2.6.11では、以下のように変えると動きました。

(define (script-fu-SSCscale img layer )
(let* (
(save-file-name nil))
(set! save-file-name "SSC512.tga")
(gimp-image-set-filename img save-file-name)
(gimp-image-scale img 512 512)
(gimp-displays-flush)
(file-tga-save TRUE img layer (car (gimp-image-get-filename img)) (car (gimp-image-get-filename img)) FALSE 1)
(gimp-image-clean-all img)
);end of let
);end of define

(script-fu-register
"script-fu-SSCscale" ;Script name
"<Image>/Script-Fu/SSCscale" ;Menu
"Scale Image " ;Description
"nanashi" ;Creater
"copyright 2012, nanashi"
;copyright notice
"Jan 26, 2012" ;date created
"RGB*, GRAY*, INDEXED*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
);end of register

蛇足ですが、>2 のScriptは、
set!やgimp-image-set-filenameなどがローカル変数として
定義されてしまったのだと思います。
変数定義のみのScriptという解釈なので、
何も起こらないとは結果として正しいかなと思います。
>>3
動きました−
むっちゃくちゃ楽です
もっと早くにScript-Fu勉強しとけばよかったと後悔しています

しかしletはそんな使い方だったのですねぇ
サンプルスクリプトを見てもまったく分かりませんでした
大変助かりました
使ったことのないSchemeについて教えていただいて本当にありがとうございます
っていうか使ったことなくてよく分かりましたね……
私もプログラミング言語そのものは決して素人ではないのですが……
>>3で修正していただいたScript-Fuでおおむね問題ないのですが

GIMPを起動してからいろんなフォルダを渡り歩きながら画像いじりつつこのスクリプトを使うと、
file-tga-save
で書き込まれるTGA画像ファイルのその書き込み先フォルダが不定になっているような気がします。

私の希望する動作としては
・フォルダAにあるaaa.tgaを手動でGIMPで開く。このスクリプトを実行してフォルダA内に実行結果のTGAファイルを書きこんで欲しい
・フォルダBにあるaaa.tgaを手動でGIMPで開く。このスクリプトを実行してフォルダB内に実行結果のTGAファイルを書きこんで欲しい
・フォルダCにあるaaa.tgaを手動でGIMPで開く。このスクリプトを実行してフォルダC内に実行結果のTGAファイルを書きこんで欲しい
というものなのですが、GIMPを終了せずにこの一連の作業をすると、フォルダBのaaa.tgaの実行結果もフォルダCのaaa.tgaの実行結果も全部フォルダAに上書きされてしまっているようです。

そのファイルを開いたソコのフォルダに書きこみをして欲しい、わけですが。
このようなときはどういうコードを書いたらいいものでしょう。
フォルダはあっちこっち行き来して決まったフォルダは無いので、フォルダのフルパスをコードに埋め込んでおくことはできないのです。
> 6 western@悪ノ召使 さん
乗りかかった船で考えてみました。

まず、画像のpathが取れないか試してみました。
gimp-image-get-filename
でfullpathが取れることが分かりました。

あとは文字列操作です。

悩みましたが、以下のコードでpathがとれることを確認しました。
----
(define (test-script image drawable)
(let* (
(full-path-file-name (car (gimp-image-get-filename image)))
)
(gimp-message (get-file-path full-path-file-name))
);end of let
);end of define

(define (get-file-path string)
(substring string 0
(get-position string
(- (string-length string) 1)
)
)
);end of define

(define (get-position string index)
(if (char=? #\\ (string-ref string index))
(+ index 1)
(get-position string (- index 1))
)
);end of define

(script-fu-register
"test-script" ;Script name
"<Image>/Script-Fu/test" ;Menu
"Test" ;Description
"Gamma013" ;Creater
"copyright 2012, Gamma013"
;copyright notice
"Mar 5, 2012" ;date created
"RGB*, GRAY*, INDEXED*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
);end of register
----
ウィンドウ下部にpathが表示されます。

あとはファイル名と結合するだけです。

参考にしたのは
http://www.shido.info/lisp/idx_scm.html
です。

単独のスクリプトにしておくと流用しやすいかもしれませんね。
また考えてみます。
いつもありがとうございます。

こんなかんじで、ファイル名と結合するようにしてみました。

------
(define (script-fu-dmgscale img layer )
(let* (
(full-path-file-name (car (gimp-image-get-filename img)))
(full-path-name nil)
(save-file-name nil)
)

(set! full-path-name (get-file-path full-path-file-name))

(set! save-file-name (string-append full-path-name "damage1o.tga"))
(gimp-image-set-filename img save-file-name)
(gimp-displays-flush)
(file-tga-save TRUE img layer (car (gimp-image-get-filename img)) (car (gimp-image-get-filename img)) FALSE 1)
(gimp-image-clean-all img)

(set! save-file-name (string-append full-path-name "damage1p.tga"))
(gimp-image-set-filename img save-file-name)
(gimp-image-scale img 256 256)
(gimp-displays-flush)
(file-tga-save TRUE img layer (car (gimp-image-get-filename img)) (car (gimp-image-get-filename img)) FALSE 1)
(gimp-image-clean-all img)

(set! save-file-name (string-append full-path-name "damage1q.tga"))
(gimp-image-set-filename img save-file-name)
(gimp-image-scale img 128 128)
(gimp-displays-flush)
(file-tga-save TRUE img layer (car (gimp-image-get-filename img)) (car (gimp-image-get-filename img)) FALSE 1)
(gimp-image-clean-all img)
)

);end of define

------

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

GIMP 更新情報

GIMPのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング