2026/04/01(水) [n年前の日記]
#1 [gmic] G'MICのフィルタの作り方を勉強中。その3
G'MIC用のフィルタを作ってみたい。作り方について勉強中。
環境は Windows11 x64 25H2 + GIMP 2.10.38 Portable + G'MIC-Qtプラグイン 3.7.4。
環境は Windows11 x64 25H2 + GIMP 2.10.38 Portable + G'MIC-Qtプラグイン 3.7.4。
◎ 画像スタック/画像リストについて :
G'MICには、画像スタック? 画像リスト? という、概念というか仕組み/機能があるらしい。複数の画像を保持しておくことができる機能。
要するにレイヤー、とは違うんだよな…。重なって表示されるわけではないし…。まあ、単に画像を複数持っておけますよ、それをスタックとかリストとか呼んでますよ、ということらしい。
要するにレイヤー、とは違うんだよな…。重なって表示されるわけではないし…。まあ、単に画像を複数持っておけますよ、それをスタックとかリストとか呼んでますよ、ということらしい。
- それぞれの画像にアクセスする時は [0] とか [1] とかつけるらしい。
- [-1] とつけると、スタック内の一番最後の画像、という指定になる。
- [0-50%] とつけると、0番目の画像から、スタックの真ん中あたりの画像までを指定していることになる。「-」を記述すると、ここからここまで、という指定になるっぽい。
- [0--1] とつけると…。分かりづらいけど、「0」「-」「-1」を指定している。0番目の画像から、一番最後の画像まで、つまりは全画像を指定してることになる。
- [0--1:2] とつけると、値の増え方を2ずつにする、という指定になる。[0] [2] [4] [6] ... を指定していることになる。
◎ splitについて :
split x や split y というコマンドを見かけて、「一体コレは何だろう?」と疑問に思っていたけれど、画像を分割して画像スタックに入れるコマンドだったらしい。
そのままだと元画像(画像スタック[0])に反映されない。append x や append y を使って結合する。
そういうコマンドが使えるなら…。1ラインごとに分割して横方向の表示位置を変えたらラスタースクロールっぽい見た目になるんじゃね?
試してみた。
$!、$>、shift については以下で説明されてる。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Substitution Rules
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - shift
動かしてみたら、期待通りの結果になった。
- split x を使うと、画像がx方向に分割されて、1 x h ドット、w個の画像が、画像スタックに入る。例えば 512x512ドットの画像に対して split x を指定すると、1 x 512 ドットの画像が512個作られる。
- split y なら、y方向に分割されて、w x 1 ドット、h個の画像になる。512 x 512ドットの画像なら、512 x 1ドットの画像が512個作られる。
そのままだと元画像(画像スタック[0])に反映されない。append x や append y を使って結合する。
- append x なら、画像リストの全ての画像を x 方向に結合して1枚の画像にする。
- append y なら、画像リストの全ての画像を y 方向で結合して1枚の画像にする。
そういうコマンドが使えるなら…。1ラインごとに分割して横方向の表示位置を変えたらラスタースクロールっぽい見た目になるんじゃね?
試してみた。
to_rgba # RGB画像をRGBA画像にする
split y # y方向で分割。w x 1ドットの画像が h 個作られる。
repeat $! # ループ開始。$! は、画像リストの個数を示す
# shiftコマンドで表示位置をずらす。
# $> は、ループ時のインデックス値。for (i=0; i<h; i++) { } で言うところの i に相当。
# sin() で sin値が得られる。ラジアン値を与える。角度 * pi / 180 でラジアン値になる。
# shift x,y,z,c,境界処理,補間処理
shift[$>] {36*sin(3*$>*pi/180)},0,0,0,0,1
done # ループ終了
append y # 画像リスト内の全画像をy方向に結合
$!、$>、shift については以下で説明されてる。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Substitution Rules
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - shift
動かしてみたら、期待通りの結果になった。
◎ random_patternについて :
G'MICのコマンド一覧を眺めていたら、random_pattern というコマンドが目に入った。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - random_pattern
なんだこれは! ちょっと面白そう…。
Various → Custom Code (Full)、で試してみたけど…。
プレビュー画面では何の変化もない…。
「Display Debug Info on Preview」にチェックを入れたら原因が分かった。新しい画像として作られて、画像スタックに入るのね…。そのままだと元画像に影響を与えないらしい。
元画像と合成しないといけない。合成には、blend というコマンドが使えるらしい。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - blend
「blend 合成モード,Opacity」を記述すれば合成される。この記述の仕方だと、画像スタックの全画像を合成する状態になるのかな。
合成モードは…。色々あり過ぎて何が何だか…。
ひとまず試してみた。
たしかに、元画像に対して合成できた。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - random_pattern
なんだこれは! ちょっと面白そう…。
Various → Custom Code (Full)、で試してみたけど…。
random_pattern {w},{h},2
プレビュー画面では何の変化もない…。
「Display Debug Info on Preview」にチェックを入れたら原因が分かった。新しい画像として作られて、画像スタックに入るのね…。そのままだと元画像に影響を与えないらしい。
元画像と合成しないといけない。合成には、blend というコマンドが使えるらしい。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - blend
「blend 合成モード,Opacity」を記述すれば合成される。この記述の仕方だと、画像スタックの全画像を合成する状態になるのかな。
合成モードは…。色々あり過ぎて何が何だか…。
ひとまず試してみた。
repeat 3 # ループ開始
random_pattern {w},{h},2 # ランダムパターン画像を作成
to_rgba[-1] # RGB画像をRGBA画像に変換。[-1]を指定しているのでストックの最後の画像に対して処理をする
blend alpha,0.3 # 合成。alphaはアルファチャンネルに基づく合成だが、Opacityが0.3なのでうっすらと合成される
done
たしかに、元画像に対して合成できた。
◎ line_aaについて :
線を引きたい。lineコマンド、もしくは line_aaコマンドが使えるっぽい。
以下で、512本のランダムな線を、ランダムな色で描画する。
line_aa はアンチエイリアス付きで線を描画する、と書いてあるように見える。ということは、line はアンチエイリアス無しのギザギザした線なのだろう…。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - line
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - line_aa
u() は疑似乱数を返す関数(?)だけど、u(w) と書けば、(0 - 画像横幅)の範囲の乱数を返す。そのままだとコマンドに渡せないので、{ } で囲んで「ここは計算式だよ」と指定してやる。結果、{u(w)} と書くことになる。
同様に、{u(h)} は、(0 - 画像縦幅)の範囲の乱数を返す。
${-rgb} なる記述をどこかで見かけて、一体何を指定しているのか謎だったけど…。「-」はコマンドの前につける記号で、rgbというコマンドを呼び出していただけらしい。つまり、${-rgb} でランダムなRGB値を返してくれる。${-rgba} なら、ランダムなRGBA値を返してくれる。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - rgb
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - rgba
一番最後につけている 255 は、アルファチャンネルの値。
以下で、512本のランダムな線を、ランダムな色で描画する。
repeat 512
line_aa {u(w)},{u(h)},{u(w)},{u(h)},1.0,${-rgb},255
done
line_aa はアンチエイリアス付きで線を描画する、と書いてあるように見える。ということは、line はアンチエイリアス無しのギザギザした線なのだろう…。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - line
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - line_aa
u() は疑似乱数を返す関数(?)だけど、u(w) と書けば、(0 - 画像横幅)の範囲の乱数を返す。そのままだとコマンドに渡せないので、{ } で囲んで「ここは計算式だよ」と指定してやる。結果、{u(w)} と書くことになる。
同様に、{u(h)} は、(0 - 画像縦幅)の範囲の乱数を返す。
${-rgb} なる記述をどこかで見かけて、一体何を指定しているのか謎だったけど…。「-」はコマンドの前につける記号で、rgbというコマンドを呼び出していただけらしい。つまり、${-rgb} でランダムなRGB値を返してくれる。${-rgba} なら、ランダムなRGBA値を返してくれる。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - rgb
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - rgba
一番最後につけている 255 は、アルファチャンネルの値。
[ ツッコむ ]
以上、1 日分です。



