2011年5月4日水曜日

イメージを描画する(4)

シャッターの巻き上げが壊れました。カメラを修理に出すことにします。

ところで Core Image は OpenGL を基盤とする画像処理技術です。静止画、動画、なにやかにやいろいろとやってくれます。とりあえず Core Image カーネル言語を試してみたいので簡単な方法でやります。

ぼかす
Quartz Composer を ”Basic Composition” で開いてパッチを並べます。[Core Image Filter] のラベルを ”Blur” と変更しています。同じ名前のパッチがありますが、それじゃありません。適当なイメージも用意して [image] にインポートしてあります。


インスペクタ・パネルを表示して [Core Image Filter] にコード記述します。


やったこと
coord_0 〜 coord_8 は現在処理中のピクセルを中心に各座標を取得しています。dist_0 〜 dist_8 は取得した座標をもとにそれぞれのピクセルのサンプルを取得しています。Core Image に渡される色成分はアルファ値が事前にかけ合わ(premultiply)されていることを前提としている(そうでないものについてはアルファ値が1.0だと推定して動作する)ので、それを unpremultiply() で解除してやります。dist で取得したサンプルの平均をとって、アルファ値をかけ合わせた値を返してやります。こうすることで、隣り合うピクセル同士のサンプルの差が小さくなり、結果としてぼけるのです。

Core Image is designed for two types of developers—filter clients and filter creators. If you plan only to use Core Image filters, you are a filter client. If you plan to write your own filter, you are a filter creator..

Core Image はフィルタを使う人と作る人のために設計されているとのことです。使う人は CI* オブジェクトを使ってごにょごにょすればよしです。作りたい人はカーネル・コードを書きます。

Core Image Kernel Language Reference には Core Image カーネル言語固有の部分しか書いてありません。その他リファレンスに書いてある 除外項目を除く GLSL のサブセットを使う事ができます。パッチで書いた vec2() は GLSL のベクトル・コンストラクタで、要素が2つのベクトルを生成します。

その他別件で。パッチ内では if とか for とかが使えませんでしたが、

Statements: continue, break, discard. Other flow control statements (if, for, while, do while) are supported only when the loop condition can be inferred at the time the code compiles.

コードをコンパイルするときにループ条件を推定できればサポートされるよ、とありますので場合によってはいけるのかもです。とりあえずここまで。

0 件のコメント:

コメントを投稿