geglでサムネイル作成コードを書く

Gimp 2.6系からの新しい画像処理エンジンのgeglのライブラリを使ってみました。

geglは画像処理ライブラリですが、DirectShowやgstのように、ソース(入力)とシンク(出力)までをフィルターでつなぐグラフを作って、実行するスタイルをとります。

下のコードではフィルタグラフはCコードで書いてますが、XMLで書いたグラフを読み込んで使うこともできます(gegl_node_new_from_file)。

Cでグラフのノードを作る場合、汎用のgegl_node_new_childで作ります。ノードの種類(ソースとかフィルタとか)は、operationと呼ばれていて、この関数の引数で指定する必要があります。以下には、標準のoperationと、そのオプションが入っています。

C言語での利用例: 画像のサムネイルPNGを作成するプログラム

画像ファイルソースinput、PNGファイルシンクoutput、縮小フィルタfilterを作り、グラフがinput|filter|output になるようにつないで、実行するだけのコードです。

縮小サイズがなぜか縦横ともに2pixelづつ大きくなってしまうので、スケール計算では2引いてます。理由を知りたい。

(ちなみにこれもlibgcとは組み合わせられませんでした。)

例: pywebkitgtkとPILでWebページのサムネイル作成 - ラシウラC言語版のサムネイル化をgeglで行わせる

上記のスケールとサイズの問題は、x,yそれぞれwhileループで調整しています。

付録: geglのoperationとそのプロパティの一覧を生成するプログラム

[gegl:png-save]
* input : GeglBuffer (RW)
 <Input> Input pad, for image buffer input.
* path : gchararray (RWC)
 <File> Target path and filename, use '-' for stdout.
* compression : gint (RWC)
 <Compression> PNG compression level from 1 to 9
* bitdepth : gint (RWC)
 <Bitdepth> 8 and 16 are amongst the currently accepted values.

という感じで出ます。