2010年09月15日

gimp-vectors-* PDB 関連

GIMP-1.2の頃ではパスのベジエ曲線を描くPDBは gimp-path-* でしたが、GIMP-2.4以降で gimp-vectors-* 関数の大部分が実装され、ベジエ曲線の描画はgimp-vectorsを使うようになりました。さらにGIMP-2.6では未実装だった関数が実装されて実用十分になったようです。
Script-Fuでgimp-pathを使ったことはありましたが、gimp-vectorsはまだ使ったことがないので、ちょっと使用法を調べてみました。

■ 作成例

GIMPでpathやvector関連の作業を担当していらっしゃる、Simon氏が作ったサンプルスクリプトが分かりやすいです。
基本的にはgimp-pathと同じようです。

(define (script-fu-draw-circle image layer)
(let* (
(w (car (gimp-image-width image)))
(vectors 0)
)
(set! vectors (car (gimp-vectors-new image "circle")))
(gimp-image-add-vectors image vectors -1)
(gimp-vectors-bezier-stroke-new-ellipse vectors
(/ w 2) (/ w 2) (/ w 3) (/ w 3) 0)
(gimp-edit-stroke-vectors layer vectors)
)
)

(script-fu-register "script-fu-draw-circle"
"Draw Circle"
"Sample script to draw a circle"
"Simon Budig"
"(c) 2007 Simon Budig"
"4. 09. 2007"
"*"
SF-IMAGE "input image" -1
SF-DRAWABLE "active drawable" -1
)

(script-fu-menu-register "script-fu-draw-circle"
"/Filters/Render")




■ gimp-vectors-stroke-new-from-points

この関数はGimpでのパス操作のようにベクトルオブジェクトを描画する関数のようです。

(gimp-vectors-stroke-new-from-points
vectors
type
num-points
#( ix1 iy1 ax1 ay1 oy1 oy1
ix2 iy2 ax2 ay2 oy2 oy2
ix3 iy3 ax3 ay3 oy3 oy3 )
closed)


ix,iy は進入方向のコントロールハンドルの座標
ax,ay はアンカーの座標
ox,oy は出口方向のコントロールハンドルの座標

その部分を曲線ではなく直線したい場合は、コントロールハンドルとアンカーの座標を同じにします。

☆浮動小数点配列の用意・セットメモ

(let* ((points (cons-array (* num 6) 'double))
〜中略〜
(aset points (+ (* 6 count) i) x)



■ gimp-vectors-bezier-stroke-new-moveto

上のstroke-from-new-pointsはすべての座標を全部一度に指定して描画してしまう方法ですが、こちらは一ヶ所づつ指定するやり方です。イメージ的には通常のパスツールの使い方と同じでしょうか。

具体的には、bezier-stroke-new-movetoでベクトル描画の開始座標を指定して、gimp-vectors-bezier-stroke-linetoを繰り返せば次々に一筆書きの「直線」を描きます。
gimp-vectors-bezier-stroke-linetoではなくて、gimp-vectors-bezier-stroke-conictoやgimp-vectors-bezier-stroke-cubictoであれば「スプライン曲線」を描きます。
一筆書きをやって最終的に始点と終点を連結させてストロークを閉じるには(close)、gimp-vectors-stroke-closeを使います。


ちょっと思ったのは、先に計算して出した座標をどうやってベクトル配列に入れるのか?という問題です。個人的にはScript-Fuではリストのほうが何かと相性がいいので、一旦リスト配列に入れてからlist->vectorの方法かなぁ。


■ リンク

今回のvectorsの情報を探していたら凄いサイトを見つけました。
Script-Fuを書くときに非常に重宝しそうです。
アルゴ算法堂 / グラフィック
posted by いっちー at 19:57| Comment(3) | Script-Fu | 更新情報をチェックする
この記事へのコメント
いっちーさま、はじめまして。
こちらの記事のお陰で Script-Fu で『座標データからパスを作る』ことができました。感謝します。
勝手ながら、当方のブログで引用させていただきました。http://d.hatena.ne.jp/foussin/20130530/1369846436

ところで、パスから実線を作る

『パスに沿って描画』コマンド
(パスでストローク描画)

がありますが、これを Script-Fu で再現する方法をご存知でしょうか。もしご存知でしたら教えてください。宜しくお願いします。
Posted by foussin at 2013年05月30日 14:59
こんばんは。
そのコマンドは、PDBには入っていないようですね。(app/pdb/vectors-cmd.c)
GimpStrokeOptionsつきのgimp-item-stroke()を呼び出す必要があるのかな。

すると残りは、普通にgimp-edit-stroke-vectorsかgimp-vectors-bezier-stroke-*でしょうかね。

あとご存知かもしれませんが、スクリプトのエラー原因究明はこちらもどうぞ。
http://twist.jpn.org/gimpwiki/index.php?ScriptFuClass%2FStaying
Posted by いっちー at 2013年05月31日 22:14
いっちーさん、こんにちは。つまり、Script-Fu だけでは『パスをストローク描画』はできない…ということですね。

そうなると、自分のスキルを超えた話になるので、その実装は諦めます。

アドバイスありがとうございました。
Posted by foussin at 2013年06月01日 12:52
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。