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で行わせる
- getscreenshot_gegl.c: http://gist.github.com/139457
上記のスケールとサイズの問題は、x,yそれぞれwhileループで調整しています。
付録: geglのoperationとそのプロパティの一覧を生成するプログラム
- geglops.c: http://gist.github.com/139566
[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.
という感じで出ます。