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

#2 [tv] TVアニメの紹介放送スペシャルは悪手

TVアニメの初回放送スペシャルについて愚痴をメモしていたのだけど、AIに編集してもらったらどんな文章になるのかふと気になって、Google Gemini にお願いしてみたらなかなかイイ感じの文章を出してきたので試しにまるっと載せてみるテスト。

以下、Google Geminiの出力結果です。サブタイ(?)もAIが出してきました。

テレビアニメにおける「初回スペシャル放送」の戦略的欠陥に関する考察 :

テレビアニメの放送開始にあたり、初回を数時間枠のスペシャル版として編成する、あるいは複数話を一挙放送する手法が増加している。しかし、視聴者側の録画・視聴環境および番組構成の観点から分析すると、これらは必ずしも視聴者獲得に寄与するとは限らず、むしろ逆効果となる要因を複数含んでいる。


1. ハードウェアの制約による「視聴断念」の誘発

現代のアニメ視聴環境において、HDDレコーダーを用いた録画視聴は一般的な手段である。しかし、多くの視聴者は以下の物理的制約に直面している。

● チューナー数の競合: 深夜帯などの特定時間帯にアニメ番組が集中する場合、一番組で長時間枠を占有することは、他局の番組との重複リスクを飛躍的に高める。

● 強制的な選択: 録画ユニット数を超える重複が発生した場合、視聴者は「優先順位の低い番組」を切り捨てざるを得ない。結果として、新規顧客であるはずの「試しに見てみよう」という層を、放送開始以前に物理的な理由で排除(ドロップアウト)させる要因となる。


2. 露出機会の損失とコスト対効果の矛盾

放送時間を延長することは、競合するライバル番組の数を倍増させることを意味する。

● リスクの拡大: 通常の30分枠であれば回避できたはずの強力な裏番組と接触する可能性が高まり、相対的に視聴の選択肢から外れる確率が増大する。

● 投資効率の低下: 放送枠の確保には相応のコストを要するが、自ら視聴機会を狭める形で枠を拡張することは、投資に対するリターン(視聴者数・認知度)を最大化する戦略とは言い難い。


3. シリーズ構成の不整合による品質低下

一挙放送が成功を収めるためには、その長時間枠を一つの「物語の塊」として成立させる緻密な脚本・構成が不可欠である。

● 構成の不備: 成功事例(例:『推しの子』等)に倣い、後付けで長時間放送を決定した場合、現場の制作意図と放送形態に乖離が生じる。

● 視聴者の困惑: 本来30分ごとに区切りを持たせるよう設計されたエピソードを無理に連結しても、冗長な印象を与え、作品の没入感を削ぐ結果を招きかねない。


4. プラットフォームの利便性における優位性の喪失

現在、インターネット配信は「放送時間の制約」や「同時録画数の制限」を受けない柔軟な視聴体験を提供している。

● テレビメディアの不便さの強調: テレビ側が自ら視聴のハードル(長時間拘束・予約の競合)を上げることは、配信への流出を加速させる。

● 機会喪失の恒久化: 初回放送で「視聴環境に適合しない」と判断された作品は、その後の放送回を含め、視聴リストから恒久的に除外されるリスクが高い。


結論

アニメ作品の制作には多大な時間と費用が投じられる。しかし、その出口戦略である放送形態において、視聴者の物理的な視聴環境を無視した「初回スペシャル」という選択をすることは、自ら「視聴候補からの脱落」を促す悪手となる可能性を否定できない。


以上、AIに編集してもらった結果でした。

元の文章 :

以下、自分が元々メモしてた愚痴です。このアホアホな文章をAIに渡したら上の文章にしてくれました。いやはや、AIって凄いなあ…。

思考メモです。

TV番組表を眺めていたら、某TVアニメが「初回n時間放送スペシャル!」「第n話まで一挙放送!」と銘打っていて…。

またか。勘弁して。

その時間帯は他局もアニメ番組を放送してるのでHDDレコーダがフル稼働状態で…。だから1番組で1時間半も放送されたらチューナー数の問題でその番組の録画/視聴を諦めるしかない。このアニメ、もう初回からして切るしかないじゃんよ…。初回放送スペシャルなんてやらなければまだどうにか録画して見れたかもしれないのに…。

いつもより長い時間放送するということは、競争番組/ライバル番組も倍増するわけで、その結果、見てもらえる可能性だって少なくなるだろうに…。放送するのってお金がかかるのではないかと想像するのだけど、わざわざ余計にお金を払って(?)、見てもらえる可能性を自らグングン減らしてる。アレは一体何なんだろう…。それとも「ウチのアニメは他のアニメより優先して録画/視聴してもらえるはず!」と製作委員会(?)は思っているのだろうか。どんだけ自信満々なんや…。

そもそも一挙放送向きのシリーズ構成をちゃんとしてあるのだろうか…? 「推しの子」が上手く行ったものだから、ウチもウチもと上のほうの偉い人達が浅い考えでこういうことをやらかしてたりしないかと邪推してしまう…。「推しの子」はそれが効果的と思える巧みな構成だったけど、他のアニメは「これって一挙放送する意味あったか?」と首を捻ってしまった番組がチラホラ…。現場も困惑してないか…。「そういうことしたいなら最初から言っといてくれれば意識して構成できたのに今頃急に言われてもどうしようもねえよ!」で、仕方なくフツーの構成そのままで放送して視聴者側も「なんやこれ…なんでこんな放送するん…意味わからん…」と困惑する状況になってる感も…。

一体誰なんだよ…。「初回放送スペシャルやろうぜ!」とか言い出してるのは…。皆が不幸になるからやめてくれ…。

もっとも、今の御時世、そもそもTVなんか捨ててネット配信で視聴するほうが賢いのだろうけど…。ネット配信ならチューナー数がどうとかシリーズ構成がどうとかそんなの一切気にしないで気になるコンテンツを確実に視聴できてしまう。対してTVは放送スケジュールと他局の番組の兼ね合いでその番組の視聴は無理という状況が度々発生する。不便だよなあ…。

只でさえ不便なのに、初回放送スペシャルとやらでますます不便さをプラスしてる…。TV業界の人達って自殺願望でもあるの?

いや、でも、これってチャンスかもしれない。最近アニメの本数が多過ぎて全部抑えるとかもう無理やって感じだったし、せっかくあちらから「さあ、切ってくれ!」と言ってきたも同然なのだから、お言葉に甘えてこのアニメは切らせてもらおう…。ていうか自分が見ても見なくても何がどうなるわけでもないし…。

それにしても、アニメを作るのってお金も時間もかかるはずなのに、いざ放送というタイミングで、どうしてこういう愚行を…。なんだかなあ…。

思考メモです。オチは無いです。

2026/04/03追記 :

考えてみたら、「TVerで見逃し配信してます」と宣伝すれば、こういった問題はそこそこ解決できてしまうのではないかと思えてきた。いやまあ、件のアニメが配信をしてるかどうかは把握してないのだけど…。TVerを利用するためにはネット環境が必要という問題もあるか…。

TVという視聴形態をメインに据えたままでも、ネット配信を併用すれば、TVの不便さをある程度解消できる可能性は十分にあるのかもしれない。いや、もしかすると、そこはもう逆になっているのだろうか。ネット配信をメインに据えながら、場合によってはTVも併用して露出を増やす、という捉え方のほうが今風だったりするのかも。

もっとも、ネット配信のサポート役として活躍できるほどの強みを、はたしてTVが持っているのかどうかという疑問も湧いてきた。数々の不便さにも目を瞑れるほど、TVだけが持っている強みとは何か。TVには一体どんなメリットがあるのか。 TVってなんだろう? …そこについてもAIに尋ねてみようかしらん。

以上、1 日分です。

過去ログ表示

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