2026/04/04(土) [n年前の日記]
#1 [gmic] G'MICのフィルタの作り方を勉強中。その5
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で配列を使いたい。使えるのかな?
動的配列というものが用意されているらしい。画像スタック内の画像データの1つを、値を格納する領域として利用して、追加や削除をすると画像サイズが自動で変化するそうで…。
「画像を配列として使うんかーい」と最初は驚いたけど、考えてみたら画像データって配列みたいなものだし…。メモリ領域を確保して値を格納したり取り出したりできれば何を使ってもいいんだよな…。コンピュータにとっては何であろうとメモリにアクセスしてることに違いはなく、人間がその領域を画像だの配列だの呼び分けているだけだわな…。
以下のコマンドがあるっぽい。他にも色々あるっぽいけどよく分かってない。
ドキュメントの、「Dynamic arrays:」の項目に説明が書いてある。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Mathematical Expressions
とりあえず、何かしらのサンプルを書いて動作確認してみる。
ランダムな座標を一旦動的配列に格納して、後で動的配列から座標値を得てその位置に円を描画する処理を書いてみた。単にこういう処理をしたければループを回して即座に描画してしまえばいいけれど、今回は動的配列の使い方を把握するためにわざと回りくどいことをしている。
Various → Custom Code、にコピペして、Desplay Debug Info on Preview をOn/Offすれば、画像の中に値が格納されてる様子もなんとなく分かるかなと…。
注意点その1。どうも現状では、動的配列用の画像として、RGB画像、もしくは、RGBA画像を用意しないと値を格納できない気配がする…。
当初、画像を用意する際に 1,1,1,2 と記述して、チャンネル数=2 の画像を作成して値を格納しようとしたのだけど、どんな書き方をしてもエラーしか出なくて…。試しに 1,1,1,3 と記述してRGB画像にして、[x, y, ダミー値] を記録するようにしたら、ようやくエラーが出ない状態になった。
注意点その2。動的配列関連のコマンド、da_*() は、eval " - " の中に入れないと動かない時がある。しかし、eval " - " の中に入れなくても動く時もある。条件がよく分からない…。
eval " - " というのは、「この中は数式モードで記述してありますよ」的コマンドだろうか? 通常時とはちょっと違う書き方ができるらしい。スペースを入れてもエラーが出なかったり、「;」で行の最後を示したりする。
注意点その3。動的配列用の画像の高さと、動的配列の個数は一致しない。画像の高さのほうがちょっと大きくなる。
当初、一致しないものだから何か間違えてるのかと悩んでしまった…。一致しないのがフツーらしい。もし、一致させたい時は、 da_freeze() を使えば一致させることができる。ただ、これを使うと今度は配列個数を取得できる da_size() がエラーになる…。何故? もっとも、da_freeze() を使えば、動的配列個数=画像の高さになるので、それはそれで困らないのかな…。
その他の細かいところとしては…。
ちょっと分からないのが、「#$darray」と書いても「$#darray」と書いてもエラーが出ないまま通る時がある…。もしかしたらこの記述はおかしいのだろうか…。
ちょっと分かってきた。通常モードと数式モードで違うっぽい? 通常モードなら $darray と書くだけでOKっぽい。数式モードでは #$darray と書かないとエラーになる。
動的配列というものが用意されているらしい。画像スタック内の画像データの1つを、値を格納する領域として利用して、追加や削除をすると画像サイズが自動で変化するそうで…。
「画像を配列として使うんかーい」と最初は驚いたけど、考えてみたら画像データって配列みたいなものだし…。メモリ領域を確保して値を格納したり取り出したりできれば何を使ってもいいんだよな…。コンピュータにとっては何であろうとメモリにアクセスしてることに違いはなく、人間がその領域を画像だの配列だの呼び分けているだけだわな…。
以下のコマンドがあるっぽい。他にも色々あるっぽいけどよく分かってない。
da_size() : 動的配列の個数を取得 da_push() : 動的配列の末尾に値を追加。動的配列のサイズは自動で増える。 da_pop() : 動的配列の末尾から値を取り出す。動的配列の中から値は消える。 da_insert() : 動的配列に値を追加する。インデックス値を指定して、その場所に追加できる模様。 da_freeze() : 動的配列用画像のサイズと、動的配列の個数を一致させる?
ドキュメントの、「Dynamic arrays:」の項目に説明が書いてある。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Mathematical Expressions
とりあえず、何かしらのサンプルを書いて動作確認してみる。
ランダムな座標を一旦動的配列に格納して、後で動的配列から座標値を得てその位置に円を描画する処理を書いてみた。単にこういう処理をしたければループを回して即座に描画してしまえばいいけれど、今回は動的配列の使い方を把握するためにわざと回りくどいことをしている。
Various → Custom Code、にコピペして、Desplay Debug Info on Preview をOn/Offすれば、画像の中に値が格納されてる様子もなんとなく分かるかなと…。
1,1,1,3,0 => darray # 動的配列用の画像(RGB)を作成。名前を darray にする。「=>」は「name.」と同じ意味
# 乱数で座標を生成。動的配列の末尾に da_push() で追加して記憶しておく
repeat 8
rx={u(w#0)} # 入力画像(#0)の幅/高さの範囲で乱数を得る
ry={u(h#0)}
eval "da_push(#$darray,[$rx, $ry, 0])" # 動的配列に追加
circle[0] $rx,$ry,18,1.0,255,0,0,255 # 位置を確認するために赤い円を描画。circle x,y,R,Opacity,R,G,B,A
done
# 動的配列を参照して描画
num=da_size(#$darray) # 配列数を取得
repeat $num
x,y,r={da_pop(#$darray)} # 配列の末尾から座標を取り出す
circle[0] $x,$y,14,1.0,255,255,255,255 # 白い円を描画
done
# rm[$darray] # 動的配列用の画像を削除
注意点その1。どうも現状では、動的配列用の画像として、RGB画像、もしくは、RGBA画像を用意しないと値を格納できない気配がする…。
当初、画像を用意する際に 1,1,1,2 と記述して、チャンネル数=2 の画像を作成して値を格納しようとしたのだけど、どんな書き方をしてもエラーしか出なくて…。試しに 1,1,1,3 と記述してRGB画像にして、[x, y, ダミー値] を記録するようにしたら、ようやくエラーが出ない状態になった。
注意点その2。動的配列関連のコマンド、da_*() は、eval " - " の中に入れないと動かない時がある。しかし、eval " - " の中に入れなくても動く時もある。条件がよく分からない…。
eval " - " というのは、「この中は数式モードで記述してありますよ」的コマンドだろうか? 通常時とはちょっと違う書き方ができるらしい。スペースを入れてもエラーが出なかったり、「;」で行の最後を示したりする。
注意点その3。動的配列用の画像の高さと、動的配列の個数は一致しない。画像の高さのほうがちょっと大きくなる。
当初、一致しないものだから何か間違えてるのかと悩んでしまった…。一致しないのがフツーらしい。もし、一致させたい時は、 da_freeze() を使えば一致させることができる。ただ、これを使うと今度は配列個数を取得できる da_size() がエラーになる…。何故? もっとも、da_freeze() を使えば、動的配列個数=画像の高さになるので、それはそれで困らないのかな…。
その他の細かいところとしては…。
- 「name. 名前」と書くと、その画像に名前をつけて管理できるけれど、「=> 名前」と書くことでも同じ意味になるらしい。「name.」の最後の「.」は、画像スタックの一番最後の画像を指定しているらしい?
- 入力画像(#0)の幅と高さを取得したい時は、「w#0」「h#0」と書ける。「#0」が画像スタックの一番最初の画像を指定しているらしい。
- 動的配列関連のコマンド、da_push()等を利用する時は、画像スタックのインデックス値を指定するらしいけど、「#1」とか「#2」と記述できる。名前で指定する時は「#$名前」で通るっぽい?
ちょっと分からないのが、「#$darray」と書いても「$#darray」と書いてもエラーが出ないまま通る時がある…。もしかしたらこの記述はおかしいのだろうか…。
x,y,r={da_pop(#$darray)} # 配列の末尾から座標を取り出す
↑ ↓ どっちもエラーが出ない…
x,y,r={da_pop($#darray)} # 配列の末尾から座標を取り出す
ちょっと分かってきた。通常モードと数式モードで違うっぽい? 通常モードなら $darray と書くだけでOKっぽい。数式モードでは #$darray と書かないとエラーになる。
[ ツッコむ ]
以上、1 日分です。

