mieki256's diary



2026/03/31(火) [n年前の日記]

#1 [gmic] G'MICのフィルタの作り方を勉強中。その2

G'MIC用のフィルタを作ってみたい。作り方について勉強中。

環境は Windows11 x64 25H2 + GIMP 2.10.38 Portable + G'MIC-Qtプラグイン 3.7.4。

どうして G'MICのフィルタを作成したいのかと言うと…。G'MICフィルタを自作できれば、G'MIC を呼び出せる画像編集ソフトならどこでもそのフィルタを利用できる状態になるよなと…。フィルタを一つ書くだけで、GIMP、Krita、Paint.NET、Photoshop等々、どのアプリでもそのフィルタを使えてしまう。結構大きいメリットじゃなかろうかと…。

フィルタを記述していくファイルについて :

G'MICはテキストファイルに G'MICスクリプトを記述していくことでフィルタの作成や追加ができる。ただ、その記述をどのファイルに書けば反映されるのか…。

Windowsの場合、C:\Users\(自分のユーザ名)\user.gmic というファイルを作成して、その中にフィルタを記述していけば、GIMP + G'MIC-Qtプラグインに反映される。

または、任意のフォルダに hoge.gmic を作成して、そのファイルも参照するように G'MIC-Qtプラグインの設定を変更することもできる。
  1. G'MIC-Qtプラグインを起動。
  2. Settingsボタンをクリック。
  3. Filter Sources タブを選択。
  4. Add New ボタンをクリックして、読み込ませたい .gmic ファイルを指定。
試してみたけれど、ちゃんと反映された。

あるいは、環境変数 GMIC_PATH を新規作成して、任意のフォルダを設定しておいて、そのフォルダ内に user.gmic というファイルを入れておけば反映される、 かもしれない。これはまだ試してない。

Hello World的フィルタ :

以下のページを参考にして、Hello World的な簡単なフィルタを作成してみた。

_Comment creer un filtre dans le greffon G’mic ? - GreycLab/gmic-community Wiki
_How to create a custom filter in the G’mic plug in - GreycLab/gmic-community Wiki
_How to create a custom filter in the G’mic plug-in | G'mic tutorials

画像を回転させるだけのフィルタ。こういう見た目になった。My Filters → My First Filter、で呼び出せる。

gmic_my_filter_ss01.png

#----------------------------------------
# My first filter
#@gmic
#@gui ____<b>My Filters</b>

#@gmic fx_myfirstfilter : Angle, Interpolation, Boundary conditions, Center x, Center y
#@gmic : My first filter.

#@gui My First Filter : fx_myfirstfilter, fx_myfirstfilter_preview(0)
#@gui : sep = separator()
#@gui : note = note("My first filter settings:")

#@gui : Angle = float(45, 0, 360)
#@gui : Interpolation = choice(1, "None", "Linear", "Bicubic")
#@gui : Boundary conditions = choice(0, "Dirichlet", "Neumann", "Periodic", "Mirror")
#@gui : Center X (%) = float(50, 0, 100)
#@gui : Center Y (%) = float(50, 0, 100)

#@gui : sep = separator()
#@gui : note = note("<small>Authors : <i>Your name</i> , Latest update: <i>2026/03/30</i>.</small>")
#@gui : note = link("Example URL","https://example.com/")

fx_myfirstfilter :
  angle=$1
  interp=$2
  bound=$3
  cx={w*$4/100}
  cy={h*$5/100}
  rotate $angle,$interp,$bound,$cx,$cy

fx_myfirstfilter_preview :
  fx_myfirstfilter $*

  • 行頭に「#」がある行はコメント行。
  • 「#@gmic」は G'MICフィルタのドキュメントを作成する時に利用されるらしい。
  • 「#@gui」は、G'MIC-Qtプラグイン上でGUI表示をするための行。入力パラメータや注釈について記述できる。

少しずつ説明していく。

#----------------------------------------
# My first filter
#@gmic
#@gui ____<b>My Filters</b>
「#@gui ____<b>My Filters</b>」で、カテゴリを指定。この場合フィルタ一覧の中に「My Filters」というカテゴリを作って、その中にこのフィルタが入る。「_」を4つ並べると、ルート階層を指定したことになる、らしい?

#@gmic fx_myfirstfilter : Angle, Interpolation, Boundary conditions, Center x, Center y
#@gmic : My first filter.
G'MICフィルタとしてドキュメントを作成する時に役立つらしい。フィルタ名と、引数の種類と数を列挙して、どんなフィルタなのか説明文を書いておけば、ヘルプ表示時に出力されるのだとか。もっとも、自分しかこのフィルタを使わないなら、ドキュメント等は要らないのでこのあたりの記述は不要になる。

#@gui My First Filter : fx_myfirstfilter, fx_myfirstfilter_preview(0)
フィルタについての宣言行。「フィルタ一覧に表示するフィルタ名」「フィルタ名(関数名)」「プレビュー時に呼ばれる関数名」を指定する。

#@gui : sep = separator()
#@gui : note = note("My first filter settings:")

#@gui : Angle = float(45, 0, 360)
#@gui : Interpolation = choice(1, "None", "Linear", "Bicubic")
#@gui : Boundary conditions = choice(0, "Dirichlet", "Neumann", "Periodic", "Mirror")
#@gui : Center X (%) = float(50, 0, 100)
#@gui : Center Y (%) = float(50, 0, 100)

#@gui : sep = separator()
#@gui : note = note("<small>Authors : <i>Your name</i> , Latest update: <i>2026/03/30</i>.</small>")
#@gui : note = link("Example URL","https://example.com/")
「#@gui : 」で、GUI表示の指定をしてる。この場合、5つの入力パラメータ(Angle, Interpolation, Boundary conditions, Center X, Center Y)がある、と指定してる。
  • sep = separator() ... セパレータ/区切り/水平線の指定。
  • note = note("My first filter settings:") ... 注釈の表示。記述した文字列がそのまま表示される。<small> - </small> や <i> - </i> のようなHTMLタグっぽい指定も利用できる。
  • note = link("Example URL","https://example.com/") ... 注釈部分はURLを指定してリンクを張ることもできる。
  • Angle = float(45, 0, 360) ... 入力パラメータを指定。この場合、実数(float)で、デフォルト値は45、0 - 360 の範囲の値を取ると指定。
  • 入力パラメータは、実数なら float(デフォルト値, 最小値, 最大値)、整数なら int(デフォルト値, 最小値, 最大値) を指定できる。
  • Interpolation = choice(1, "None", "Linear", "Bicubic") ... 3つの項目の中から選択できる入力パラメータを指定。最初の 1 はデフォルト値。関数に渡される値としては、文字列ではなく 0, 1, 2 のどれかになる。

fx_myfirstfilter :
  angle=$1
  interp=$2
  bound=$3
  cx={w*$4/100}
  cy={h*$5/100}
  -rotate $angle,$interp,$bound,$cx,$cy
フィルタ処理関数を定義している。
  • fx_myfirstfilter : ... 関数定義部分の開始。以降の行はインデントすることで、この関数の定義部分ということになる。
  • angle=$1 ... 分かりやすくするために、それらしい名前の変数を宣言して、1番目のパラメータを代入している。
  • 2番目、3番目のパラメータは $2、$3 と書く。
  • 変数を宣言/代入する時は「=」の前後にスペースを入れてはいけない。ただ、数式モードなる記述方法も用意されているそうで、そちらならスペースを入れてもいいらしい。その場合行末に「;」をつけたり等、書き方がちょっと違ってくる。数式モードについてはまだ全然調べてない。
  • cx={w*$4/100} ... { } で囲むと、その中は計算式ですよ、という指定になる。画像の横幅、縦幅は、w, h に入っている。ここでは 0 - 100 のパーセント指定からピクセル値を求めている。
  • -rotate $angle,$interp,$bound,$cx,$cy ... 画像を回転させるコマンド。rotate 角度, 補間方式, 境界処理, 中心位置 x, 中心位置 y を指定する。
  • 変数を参照する時は $angle のように、「$」を変数名の前につける。
  • コマンド名の前には「-」をつけてもいいし、つけなくてもいいらしい。

rotate コマンドの引数については以下が参考になる。

_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - rotate

fx_myfirstfilter_preview :
  fx_myfirstfilter $*
プレビュー時に呼ばれる関数。$* を指定すると、パラメータ全部を渡す指定になるらしい。

四角を描きまくるフィルタを作成してみた :

画像内に四角/矩形を描きまくるフィルタを作成してみた。GIMP用に昔書いた _random-boxes-pycairo.py と似た処理をするフィルタ。


gmic_my_filter_ss02.png

My Filters → Random gray rectangles、で呼び出せる。

#----------------------------------------
# Draw random gray rectangles
#@gmic
#@gui ____<b>My Filters</b>

#@gmic fx_randomgrayrectangles : count, wmin, wmax, hmin, hmax, userandseed, randseed
#@gmic : Draw random gray rectangles.

#@gui Random gray rectangles : fx_randomgrayrectangles, fx_randomgrayrectangles_preview(0)
#@gui : note = note("Draw random gray rectangles.")
#@gui : sep = separator()
#@gui : Count = int(512, 1, 2048)
#@gui : Rectangle width min = int(16, 1, 512)
#@gui : Rectangle width max = int(64, 1, 512)
#@gui : Rectangle height min = int(16, 1, 512)
#@gui : Rectangle height max = int(128, 1, 512)
#@gui : Use random seed = bool(0)
#@gui : Random seed = int(0, 0, 2147483647)
#@gui : sep = separator()
#@gui : note = note("Authors : mieki256 , Latest update: 2026/03/30")

fx_randomgrayrectangles :
  if $6
    srand $7
  fi

  repeat $1
    col={int(u(0,256))}

    wmin={min($2,$3)}
    wmax={max($2,$3)}
    hmin={min($4,$5)}
    hmax={max($4,$5)}

    rw={u($wmin,$wmax)}
    rh={u($hmin,$hmax)}
    x0={u(0-$rw,w-1)}
    y0={u(0-$rh,h-1)}
    x1={$x0+$rw}
    y1={$y0+$rh}

    # draw rectangle
    rectangle $x0,$y0,$x1,$y1,1.0,$col,$col,$col,255
  done

fx_randomgrayrectangles_preview :
  fx_randomgrayrectangles $*

  • if - fi で if 文を書ける。
  • u(最小値, 最大値) で疑似乱数を取得できる。
  • srand シード値、で疑似乱数の乱数種を指定。
  • repeat 繰り返し数 - done で繰り返しループができる。
  • rectangle コマンドで四角(矩形)を描画できる。rectangle x0, y0, x1, y1, Opacity, R, G, B, A を与える。Opacity は 0.0 - 1.0 を指定。R,G,B,A は 0 - 255 を指定。

rectangle コマンドの引数については以下を参照のこと。

_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - rectangle

u() については以下で少し記述されてる。

_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Mathematical Expressions


ちょっとハマったのは、rectangle コマンドの色指定のあたり。R,G,B の指定だけだとアルファ値が妙なことになって…。R,G,B,A を指定しないとそれらしくならなかった。

if文は、if - fi と書くらしい? fi で閉じるらしいのだけど、fi ではなく endif を使う旨を説明してるページも見かけた。ただ、現行版では endif はエラーになってしまう。

_if, elif, else and fi
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing

古い書き方 :

以下のページを眺めていたら、古い書き方と新しい書き方があるとのことで…。

_Making filters: Important update! | paulsphotopalace

  • #@gimp → #@gui
  • -gimp_function → -fx_function

あちこちの解説ページで「#@gimp」という記述を見かけてこれは何だろうと思っていたけれど、「#@gui」の昔風の記述だったのね…。

グループを作る時は以下のように書け、とも書いてある。
#@gui MyFilters

...

#@gui _

今のところ、下のほうの「#@gui _」を書いても書かなくてもどちらでも動いているけれど…。件の記事は 1.7.9 時代の話のようなので、今現在はまた仕様が変わっているのかもしれない。

各コマンドの動作確認をしたい :

Various → Custom Code を選ぶと、打ち込んだコマンドの動作確認ができる模様。

テキスト入力欄に動作確認したいコマンドを打ち込んで、「更新」ボタンを押せば、処理結果をプレビューしてくれる。

rectangleの仕様 :

rectangleコマンドを使うと矩形の塗り潰しができるけれど、pattern を指定した時と指定しない時で動作が変わることに気づいたのでメモ。

# パターンを指定しない場合は塗り潰しになる。Opacity(1.0)の後に、R,G,B,A が並ぶ。
rectangle 10%,10%,20%,20%,1.0,255,0,0,255
rectangle 30%,10%,40%,20%,1.0,0,255,0,255
rectangle 50%,10%,60%,20%,1.0,0,0,255,255

# パターンを指定すると線だけを描画する。Opacity(1.0)の後に、0xから始まる16進数文字列が入り、その後に R,G,B,A が並ぶ。
rectangle 10%,30%,20%,40%,1.0,0xf0f0f0f0,255,0,0,255
rectangle 30%,30%,40%,40%,1.0,0xcccccccc,0,255,0,255
rectangle 50%,30%,60%,40%,1.0,0xffffffff,0,0,255,255

gmic_rectangle_ss01.png

これを踏まえて、前述のフィルタを少し修正してみた。

#----------------------------------------
# Draw random gray rectangles
#@gmic
#@gui ____<b>My Filters</b>

#@gmic fx_randomgrayrectangles : count, wmin, wmax, hmin, hmax, userandseed, randseed, lineonly
#@gmic : Draw random gray rectangles.

#@gui Random gray rectangles : fx_randomgrayrectangles, fx_randomgrayrectangles_preview(0)
#@gui : note = note("Draw random gray rectangles.")
#@gui : sep = separator()
#@gui : Count = int(512, 1, 2048)
#@gui : Rectangle width min = int(16, 1, 512)
#@gui : Rectangle width max = int(64, 1, 512)
#@gui : Rectangle height min = int(16, 1, 512)
#@gui : Rectangle height max = int(128, 1, 512)
#@gui : Use random seed = bool(0)
#@gui : Random seed = int(0, 0, 2147483647)
#@gui : Line only = bool(0)
#@gui : sep = separator()
#@gui : note = note("Authors : mieki256 , Latest update: 2026/03/30")

fx_randomgrayrectangles :
  wmin={min($2,$3)}
  wmax={max($2,$3)}
  hmin={min($4,$5)}
  hmax={max($4,$5)}

  if $6
    srand $7
  fi

  if $8
    repeat $1
      col={int(u(0,256))}
      rw={u($wmin,$wmax)}
      rh={u($hmin,$hmax)}
      x0={u(0-$rw,w-1)}
      y0={u(0-$rh,h-1)}
      x1={$x0+$rw}
      y1={$y0+$rh}

      # draw line rectangle
      rectangle $x0,$y0,$x1,$y1,1.0,0xffffffff,$col,$col,$col,255
    done
  else
    repeat $1
      col={int(u(0,256))}
      rw={u($wmin,$wmax)}
      rh={u($hmin,$hmax)}
      x0={u(0-$rw,w-1)}
      y0={u(0-$rh,h-1)}
      x1={$x0+$rw}
      y1={$y0+$rh}

      # draw fill rectangle
      rectangle $x0,$y0,$x1,$y1,1.0,$col,$col,$col,255
    done
  fi

fx_randomgrayrectangles_preview :
  fx_randomgrayrectangles $*

「Line only」にチェックを入れると、線のみで矩形を描画する。

gmic_my_filter_ss03.png

以上です。

過去ログ表示

Prev - 2026/03 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project