Core Image

プログラミングガイド
概論

Core Image プログラミングガイド概論
注: この文書は以前、『Image Processing With Core Image(Core Image による画像処理)』
というタイトルでした。
Core Image は Mac OS X v10.4 に組み込まれている画像処理テクノロジーです。このテクノロジー
は、プログラム可能なグラフィックハードウェアをできる限り利用します。Core Image アプリケー
ションプログラミングインターフェイス(API)では、ビデオおよび静止画用の組み込み画像フィル
タにアクセスでき、カスタムフィルタと準リアルタイム処理がサポートされます。
本書は、ビデオまたは静止画の処理をサポートするアプリケーションの設計、または他のアプリ
ケーションで使用できる画像処理フィルタの作成を行う開発者に役立ちます。

このセクションの内容:
本書の構成
関連項目

本書の構成
本書は次の章で構成されています。

「Core Image の概念」では、Core Image モデル、API の構成について説明し、Core
Image API の使用にあたって必要となる主要な概念を定義します。

「Core Image フィルタの使用」では、Core Image を設定・使用して、利用可能なフィルタ
と属性のリストの取得、画像の処理、グラデーションエフェクトの適用、動的な系のイメー
ジング、ビデオへのフィルタの適用を行う方法について説明します。

「カスタムフィルタおよびイメージユニットの作成と使用」では、独自のフィルタを作成して
アプリケーションの中で使用したり、フィルタをイメージユニットとしてパッケージ化した
り、第三者が提供するイメージユニットを使用したりする方法について説明します。また、実
行可能フィルタおよび非実行可能フィルタに関する問題についても述べます。

「Core Image フィルタ」では、Mac OS X v10.4 が備えているフィルタの多くについて説明
し、フィルタを利用しての処理の前後に画像がどのように見えるかを示します。

「Core Image カーネル言語」では、カスタムフィルタ用のカーネルルーチンを作成するため
の言語について説明します。

関連項目
アップルでは、グラフィックとイメージングに関する以下の追加リソースも提供しています。

『Core Image Reference』では、Core Image API で利用できるオブジェクトおよびメソッ
ドについて詳細に説明します。

『NSCIImageRef』には、Core Image で NSImage モデルを処理するための Application
Kit 機能が追加されています。

『Quartz 2D Reference』は、Core Image フレームワークでも使用する Quartz 2D データ
タイプの網羅的なリファレンスです。

『Quartz 2D Programming Guide』には、Quartz 2D 画像と色空間を作成する方法、およ
び Quartz での 2D 描画の方法に関する情報が含まれています。

『Macintosh OpenGL Programming Guide』では、GL テクスチャと CGL グラフィックコ
ンテキストに関する情報を提供します。

OpenGL の Web サイト(www.opengl.org)には、OpenGL Shading
Language(glslang)に関する豊富な情報があります。このサイトにアクセスすれば、
glslang 構文の情報を得ることができます。この構文のサブセットを用いて、カスタムフィル
タに使用するカーネルルーチンを指定します。

『Quartz Composer Programming Guide』では、グラフィックデータの処理とレンダリン
グのために、Mac OS X v10.4 以降に付属している Quartz Composer 開発ツールの使い方
について説明します。コードを書かなくても、Quartz Composer を使用して組み込みの
Core Image フィルタで実験することができます。また、Quartz Composer を使用して、
カーネルルーチンをテストすることもできます(「Quartz Composer でカーネルルーチンを
テスト」を参照)。

『Core Video Reference』では、Core Video API について詳細に説明します。

『Core Video Programming Guide』では、Mac OS X デジタルビデオモデルについて説明
し、Core Video API の使い方を示します。

Core Image の概念
Core Image はグラフィックおよびビデオを準リアルタイムかつピクセル単位の精度で画像処理する
ために、Mac OS X v10.4 に組み込まれた拡張可能なアーキテクチャです。Core Image にバンドル
されているフィルタ、または自分や別の開発者が開発したフィルタを使用して、以下のタイプの操作
を実行できます。

画像をクロップする。

色を補正する(ホワイトポイントの調整など)。

カラーエフェクト(セピア調など)を適用する。

画像をブラーまたはシャープ化する。

画像を合成する。

画像の幾何形状を歪めたり変換したりする。

色、チェッカーボードパターン、ガウスグラデーション、その他のパターン画像を生成する。

画像またはビデオにトランジションエフェクトを追加する。

ビデオをリアルタイムで色調整する。

Core Image を利用して得られる結果については、「Core Image フィルタ」の図を参照してくださ
い。
図 1-1 に、Core Image と Mac OS X の他のグラフィックテクノロジーとの大まかな関係を示しま
す。Core Image はこれらのテクノロジーと統合されているため、これらを併用することでさまざま
な結果を得ることができます。たとえば、Core Image を使用して、Quartz 2D(Core Graphics)
で作成した画像および OpenGL で作成したテクスチャを処理することができます。また、Core
Video を使用して再生するビデオに、Core Image フィルタを適用することもできます。

図 1-1: Core Image と他のグラフィックテクノロジーとの関係

この章では、Core Image テクノロジーについて概説し、アプリケーションで API を使用する方法
を説明します。また、高速で衝撃的なリアルタイム画像処理を実現するために、Core Image が舞台
裏でどのように機能するかについても述べます。

目次:
Core Image と GPU
フィルタクライアントとフィルタクリエータ
処理パス
ワークスペース
関心領域
実行可能フィルタおよび非実行可能フィルタ
メモリ管理
色成分とプリマルチプライ済みアルファ
関連項目

Core Image と GPU
これまでは、OpenGL が、高パフォーマンスの 2D および 3D グラフィック処理の業界標準であ
り、グラフィック処理ユニット(GPU)への主要な出入り口でした。画像処理に GPU を使用するに
は、OpenGL Shading Language を知っている必要がありました。Core Image は、それをすべて
一変させます。Core Image を使えば、画像処理に GPU のパワーを利用するために OpenGL の詳細
を知っている必要はありません。Core Image が OpenGL バッファと状態管理を自動的に処理して
くれます。何らかの理由で GPU が利用できない場合は、Core Image が CPU フォールバックを使用
してアプリケーションを実行できるようにします。Core Image の動作は不透過となっています。こ
れを利用するソフトウェアはとにかく機能するのです。
Core Image は Objective-C 言語で実装された使いやすいアプリケーションプログラミングイン
ターフェイス(API)を提供することで、低レベルグラフィック処理の詳細を隠します。Core Image
API は Quartz Core フレームワーク(QuartzCore.framework)の一部です。Core Image は
Cocoa および Carbon フレームワークから使用できます。Carbon 開発者はこのフレームワークに
明示的にリンクする必要がありますが、Cocoa 開発者はその必要がありません。

フィルタクライアントとフィルタクリエータ
Core Image は 2 タイプの開発者、すなわちフィルタクライアントとフィルタクリエータ向けに設
計されています。Core Image フィルタの使用だけを予定している開発者は、フィルタクライアント
です。独自フィルタの作成を予定している開発者は、フィルタクリエータです。このセクションで
は、各タイプの開発者の観点から Core Image フィルタについて説明し、それぞれが Core Image
を使用するために知っている必要があることについて概説します。
Core Image には、アプリケーションで画像処理をサポートしたいフィルタクライアントが使用でき
る数十の組み込みフィルタが付属しています。「Core Image フィルタ」では、本書を書いた時点で
利用可能なフィルタについて説明します。組み込みフィルタのリストは変更される可能性があるた
め、Core Image は、利用可能なフィルタをシステムに照会できる機能を備えています。全フィルタ
のリストを取得することも、特定のカテゴリに適合するフィルタ(歪みフィルタやビデオを対象とす
るフィルタなど)を取得するようにクエリを絞り込むこともできます。フィルタカテゴリでは、エ
フェクトのタイプ(ブラー、歪み、ジェネレータなど)またはその用途(静止画、ビデオ、非矩形
ピクセルなど)を指定します。フィルタは複数のカテゴリに属していることがあります。また、フィ
ルタは、ユーザインターフェイスに表示できる表示名と、プログラムにおけるフィルタへのアクセス
に使用するフィルタ名も持っています。クエリを実行する方法については、「Core Image フィルタ
の使用」を参照してください。
ほとんどのフィルタには、処理を実行する方法を制御できる 1 つ以上の入力パラメータがありま
す。各入力パラメータには、NSNumber などのデータタイプを指定する属性クラスがあります。入
力パラメータは、任意で他の属性(デフォルト値、許容可能な最小値と最大値、パラメータの表示
名、CIFilter リファレンスで説明している他の任意の属性など)を持っていることもあります。
たとえば、モノクロ化フィルタ(「モノクロ化」を参照)には、3 つの入力パラメータ(処理対象画
像、モノクロカラー、および色強度)があります。画像を指定したら、必要に応じて色と色強度を
指定できます。モノクロ化フィルタなど、ほとんどのフィルタには、画像でない各入力パラメータに
対するデフォルト値があります。入力パラメータに値が設定されていなければ、Core Image はデ
フォルト値を使用して画像を処理します。
フィルタ属性はキーと値のペアとして格納されます。キーは属性を識別する定数であり、値はその
キーに関連付けられている設定です。Core Image 属性値は通常、以下のいずれかのデータタイプで
す。

文字列。表示名などに使用します。

浮動小数点数(NSNumber データタイプ)。強度レベルや半径などのスカラー値の指定に使
用します。

ベクトル(CIVector オブジェクトとしてパッケージ化)。2、3、または 4 つの要素を持つこ
とができ、各要素は浮動小数点数です。これらは位置、領域、およびカラー値の指定に使用
します。

色(CIColor オブジェクト)。カラー値とその値の解釈に使用する色空間を指定します。

画像(CIImage オブジェクト)。画像「製法」を指定する軽量オブジェクトです。

変換(NSAffineTransform)。画像に適用するアフィン変換を指定します。

Core Image はキー値コーディングを使用します。つまり、NSKeyValueCoding プロトコルの提供
するメソッドを使用することで、フィルタの属性値の取得と設定が行えます。
注:キー値コーディングは、Objective-C でオブジェクトのプロパティにアクセスするための仕組
みです。Core Image を効果的に使用するには、NSKeyValueCoding プロトコルをよく知っている
必要があります。詳細については、『キー値コーディング』を参照してください。
図 1-2 に示すように、一般的なフィルタの構成要素を詳しく見てみましょう。この図で影が付いて
いる部分は、「縁の下」の部分です。この部分については、フィルタクライアントは何も知る必要は
ありませんが、フィルタクリエータは理解している必要があります。影が付いていない部分は、フィ
ルタクライアントが呼び出す 2 つのメソッド、attributes と outputImage です。フィルタの
attributes メソッドは、フィルタの入力パラメータや、ユーザインターフェイスでのフィルタ名の

表示に使用できる文字列など、前述したフィルタ属性のリストを取得するために呼び出すものです。
outputImage メソッドはフィルタを適用しますが、実際にはイメージを処理しません。このメソッ

ドは、画像を処理するべきメソッドのように思えますが、Core Image は遅延評価を用います。つま
り、Core Image は、処理済みのピクセルを実際にデスティネーションに描画するときまでは、いか
なる画像も処理しません。outputImage メソッドが実行するのは、時間になったときに Core
Image に必要となる計算を組み立て、その計算(すなわち、画像「製法」)を CIImage オブジェク
トに格納することだけです。画像が実際にレンダリングされるのは、画像描画メソッド
(drawImage:atPoint:fromRect: や drawImage:inRect:fromRect: など)の明示的な呼び出し
がある場合だけです。

図 1-2:一般的なフィルタの構成要素

Core Image は、アプリケーションが画像を描画するコマンドを発行するまで、計算を保管していま
す。コマンドの発行があると、Core Image は結果を計算します。遅延評価は、Core Image を高速
で効率的なものにしている手法の 1 つです。レンダリング時に、Core Image は複数のフィルタを画
像に適用する必要があるかどうかを判断することができます。必要があれば、Core Image は複数の
操作を 1 つの操作に統合できます。つまり、各ピクセルが複数回ではなく、一度だけ処理されるよ
うになります。図 1-3 に、複数の操作で構成される画像処理を遅延評価がいかに効率化するかを示
します。最終的な画像はオリジナルの縮小版です。大きな画像の場合、画像を縮小する前に色調整を
行うのは、画像を縮小してから色調整を行うのに比べて処理能力が必要になります。Core Image は
最後の瞬間まで待ってからフィルタを適用するので、これらの操作を逆の順番で適用することができ
ます。

図 1-3:遅延評価のメリットを受けるワークフロー

フィルタクリエータの場合、フィルタの最も刺激的な構成要素はカーネルです。カーネルは、あらゆ
るフィルタの中心にあります。カーネルは、ソース画像の各ピクセルに対して実行される計算を指定

します。カーネル計算は非常に単純なこともあれば、複雑なこともあります。「何もしない」フィル
タの非常に単純なカーネルであれば、単純にソースピクセルを返すことが考えられます。
destination pixel = source pixel

フィルタクリエータは OpenGL Shading Language(gslang)のサブセットを使用して、ピクセル
単位の計算を指定します(「Core Image カーネル言語」を参照)。カーネルは、フィルタクライア
ントに対しては不透過です。フィルタは実のところ複数のカーネルルーチンを使用して、あるルーチ
ンの出力を別のルーチンの入力として渡すことができます。カスタムフィルタを記述する方法につい
ては、「カスタムフィルタの作成」を参照してください。
注:カーネルは Core Image に対応した gslang のサブセットを使用して書かれた実際のルーチン
であり、フィルタがピクセルの処理に使用します。CIKernel オブジェクトは、カーネルルーチンを
含む Core Image オブジェクトです。フィルタを作成すると、カーネルルーチンはそれぞれ専用の
ファイル(.cikernel 拡張子の付いたファイル)に格納されます。プログラムの中で CIKernel オブ
ジェクトを作成するには、カーネルルーチンを含んだ文字列を渡します。
フィルタクリエータは、NSBundle が指定するアーキテクチャを使用して、カスタムフィルタをプラ
グイン、すなわちイメージユニットとしてパッケージ化することで、任意のアプリケーションから利
用可能にできます。イメージユニットには、図 1-4 に示すように、複数のフィルタを含めることが
可能です。たとえば、さまざまな種類のエッジ検出を実行する一連のフィルタを書き、それらを 1
つのイメージユニットとしてパッケージ化することができます。フィルタクライアントは Core
Image API を使用してイメージユニットをロードし、そのイメージユニットに含まれているフィルタ
のリストを取得することができます。詳細については、「カスタムフィルタをイメージユニットとし
てパッケージ化する」を参照してください。

図 1-4:イメージユニットには 1 つ以上のフィルタとパッケージ化情報が含まれている

処理パス
図 1-5 に、2 つのソース画像を操作するフィルタのピクセル処理パスを示します。ソース画像は必
ず CIImage オブジェクトとして指定します。Core Image は、画像データを取得するさまざまな手
段を提供します。画像への URL を渡したり、未加工の画像データ(NSData)を読み込んだり、
Quartz 2D 画像(CGContextRef)、OpenGL テクスチャ、または Core Video 画像バッファ
(CVImageBufferRef)を CIImage オブジェクトに変換したりできます。
入力画像の実数、およびフィルタが入力画像を必要としているかどうかは、フィルタによって異なり
ます。フィルタは非常に柔軟であり、次の条件に対応できます。

入力画像がなくても機能する。フィルタによっては、画像でない入力パラメータに基づいて画
像を生成します。

1 つの画像を必要とする。

複数の画像を必要とする。画像を合成したり、1 つの画像の値を使用して別の画像のピクセル
を処理する方法を制御するフィルタは通常、複数の画像を必要とします。1 つの入力画像が、
シェーディング画像、画像マスク、または背景画像として機能したり、別の画像を処理する方
法の何らかの側面を制御するルックアップ値のソースを提供したりすることが考えられます。

画像を処理するときに、適切な入力データを含む CIImage オブジェクトを作成するのは開発者の役
目です。
注:CIImage オブジェクトには画像データが関連付けられていますが、オブジェクト自体は画像で
はありません。CIImage オブジェクトは、画像「製法」と考えることができます。CIImage オブ
ジェクトには画像の作成に必要なすべての情報を持っていますが、Core Image は指示されるまで実
際に画像をレンダリングしません。この「遅延評価」方式(「フィルタクライアントとフィルタクリ
エータ」を参照)により、Core Image は最大限効率的に機能できます。

図 1-5:ピクセル処理パス

各ソース画像のピクセルは、CISampler オブジェクトまたは単にサンプラーによって取得されま
す。その名前が示すように、サンプラーは画像からサンプルを取り出し、それらをカーネルに渡しま
す。フィルタクリエータは、ソース画像ごとにサンプラーを提供します。フィルタクライアントは、
サンプラーについて何も知る必要はありません。
サンプラーは次のことを定義します。

座標変換。変換が必要ない場合、これは恒等変換になる可能性があります。

補間モード。最近傍サンプリングまたは双一次補間(デフォルト)のいずれかです。

ラッピングモード。サンプリング対象領域がソース画像の外である場合のピクセルの作成方法
(透明の黒を使用するか、当該範囲に固定する)を指定します。

フィルタクリエータは、カーネル内にピクセル単位の画像処理計算を定義しますが、それらの計算の
実行は Core Image において処理されます。Core Image は、GPU または CPU のどちらを使用して
計算を実行するか決めます。CPU を使用する場合は、Velocity Engine および SMP(対称型マルチ
プロセッシング)の一方または両方を使用できるかどうか判断します。Core Image は、OpenGL
を通じてハードウェアラスタライズ処理を実現します。また、大きな四辺形(quad)を対象とする
非投影テクスチャルックアップでフラグメントプログラムを評価することを目的として調整されたエ
ミュレーション環境で、ソフトウェアによるラスタライズ処理を実装します。
ピクセル処理パスは、ソース画像からデスティネーションに向かいますが、Core Image が使用する
計算パスは、図 1-6 に示すように、デスティネーションを起点とし、ソースピクセルまでさかのぼ
ります。この逆方向の計算は扱いにくいように思えますが、実際には計算で使用するピクセル数が最

小限になります。Core Image が使用しない別の方法としては、すべてのソースピクセルを処理し、
その後でデスティネーションに必要なものを決定するという総当り方式があります。図 1-6 を詳し
く見てみましょう。

図 1-6:Core Image 計算パス

図 1-6 のフィルタは、ソースオーバーなど、何らかの合成操作を実行するとしましょう。フィルタ
クライアントは、各画像のほんの一部だけを合成して、図の左側に示す結果を達成できるように 2
つの画像を重ねることを目指します。デスティネーションのあるべき姿を予測することで、Core
Image はソース画像のどのデータが最終画像に影響するかを判断し、それらのソースピクセルに計
算を限定することができます。結果として、サンプラーは、図 1-6 に示したソース画像の影付きの
部分からのみサンプルを取得します。
図の中で、domain of definition(定義領域)というラベルの付いたボックスに注目してくださ
い。定義領域は、計算をさらに限定する方法にすぎません。その領域以外では、すべてのピクセルが
透明です(つまり、アルファコンポーネントが 0 です)。この例では、定義領域がデスティネー
ション画像と正確に一致しています。Core Image では、この領域を定義するために CIFilterShape
オブジェクトを用意することができます。CIFilterShape は、矩形の定義、形状の変換、形状の差し

込み、結合、および交差操作を実行できるいくつかのメソッドを備えています。たとえば、図 1-6
に示した影付きの領域よりも小さい矩形を使用するフィルタ形状を定義すると、Quartz はその情報
を使用して、計算で使用するソースピクセルをさらに限定します。
Core Image は他の方法でも効率的な処理を推進します。インテリジェントなキャッシュ処理および
コンパイラの最適化を行うので、リアルタイムビデオ制御のようなタスクに適しています。キャッ
シュされるのは、繰り返し評価される任意のデータセットの中間結果です。新しい画像を追加する
とキャッシュが大きくなりすぎる場合、Core Image はもっとも長く使用していないデータを追い出
します。つまり、頻繁に再利用されるオブジェクトはキャッシュに残り、時々使用されるオブジェク
トは必要に応じてキャッシュから出し入れされます。キャッシュ処理がどのように実装されているか
知らなくても、アプリケーションは Core Image のキャッシュ処理の恩恵を受けます。ただし、可
能な限りオブジェクト(画像、コンテキストなど)を再利用することで、最高のパフォーマンスを得
ることができます。
Core Image はまた、カーネルおよびパスレベルで従来のコンパイル技法を使用することで、高いパ
フォーマンスを実現できます。Core Image がレジスタの割り当てに使用する方法は、一時レジスタ
(カーネル単位)および一時 pbuffers(フィルタグラフ単位)の数を最低限します。コンパイラは
CSE およびピープホール最適化を実行し、事前計算に基づいたデータ依存テクスチャの読み取りと
データに依存していないテクスチャの読み取りを自動的に区別します。この場合も、コンパイル技法
の詳細を気にする必要はありません。重要な点は、Core Image がハードウェア対応であることで
す。可能な限り、それも賢明な方法で、GPU のパワーを利用します。

ワークスペース
Core Image はデバイス独立のワークスペースで操作を実行します。概念的には、図 1-7 に示すよう
なことです。つまり、Core Image ワークスペースは、理論上は範囲が無限です。ワークスペースの
特定の点は、座標のペア (x, y) で表されます。ここで x は水平軸上の位置を示し、y は垂直軸上の
位置を示します。座標は浮動小数点の値です。デフォルトでは、原点の座標は (0,0) です。
Core Image は画像を読み取ると、ピクセル位置をデバイス独立のワークスペース座標に変換しま
す。処理済みの画像を表示するときに、Core Image はワークスペース座標をデスティネーション
(ディスプレイなど)の適切な座標に変換します。

図 1-7:Core Image はデバイス独立のワークスペースで画像操作を実行する

関心領域 - ROI:Region Of Interest
図 1-6 にはラベルで明示的に示されていませんが、各ソース画像の影が付いている部分は、この図
に示されたサンプラーの関心領域です。関心領域(ROI:Region Of Interest)では、サンプラーが
処理のためにカーネルに渡すピクセル情報を取り出す対象となるソースの領域を定義します。フィル
タクライアントの場合は、ROI について気にかける必要はありません。しかし、フィルタクリエータ
の場合は、関心領域と定義領域の関係を理解する必要があります。
定義領域がフィルタの境界形状を表すものであることを思い出してください。理論上、この形状は際
限がない可能性があります。たとえば、無限に拡張できる反復パターンを作成するフィルタを考えて
ください。
ROI と定義領域は、次に示す関係を持つことができます。

正確に一致する関係。つまり、ソースとデスティネーションが 1:1 の対応関係にあります。
たとえば、色相フィルタは ROI のワークスペース座標 (r,s) のピクセルを処理し、定義領域の
ワークスペース座標 (r,s) にピクセルを作成します。

領域は互いに依存していますが、何らかの形で調整されます。特に興味深いフィルタのいくつ
か(ブラーや歪みなど)は、デスティネーションピクセルの計算に多数のソースピクセルを使
用します。たとえば、歪みフィルタは ROI 内のワークスペース座標のピクセル (r,s) とその隣
接ピクセルを使用し、定義領域に単一ピクセル (r,s) を作成します。

定義領域は、サンプラーが提供するルックアップテーブルの値から計算されます。マップ内ま
たはテーブル内の値の位置は、ソース画像とデスティネーションのワークスペース座標とは無
関係です。シェーディング画像内の (r,s) の位置にある値は、定義領域内のワークスペース座
標 (r,s) にピクセルを作成する値である必要はありません。多くのフィルタは画像ソースと、
シェーディング画像またはルックアップテーブルの値を組み合わせて使用します。たとえば、
カラーランプ、または arcsin 関数などの関数に近似するテーブルは、ワーキング座標の概念
と無関係の値を提供します。

特に指示がないかぎり、Core Image は ROI と定義領域が一致するものと仮定します。この仮定が
適用できないフィルタを作成する場合は、特定サンプラーの ROI を計算するルーチンを Core
Image に提供する必要があります。
詳細については、「ROI 関数の提供」を参照してください。

実行可能フィルタおよび非実行可能フィルタ
Core Image フィルタは、CPU を使用して実行されるかどうか(CPU 実行可能および CPU 非実行可
能)に基づいて分類できます。Core Image API を使用していると、これらが単に実行可能および非
実行可能と呼ばれていることに気付きます。フィルタクリエータは、どちらの種類のフィルタも作成
することができます。フィルタクライアントは、非実行可能のみ、または実行可能と非実行可能の両
方を使用することを選べます。
CPU 実行可能フィルタと CPU 非実行可能フィルタを分けている最大の理由はセキュリティです。非
実行可能フィルタは、GPU で実行するコードのみで構成されます。対照的に、実行可能フィルタに
は、CPU で実行するバイナリコードがあります。GPU で実行するコードは、ウイルス、トロイの木
馬、その他のセキュリティ上の脅威になりませんが、CPU で実行するコードは脅威になる可能性が
あります。
非実行可能フィルタには、特別な要件があります。その 1 つは、非実行可能フィルタをイメージユ
ニットの一部としてパッケージ化する必要があることです。フィルタクリエータは、詳細について
「非実行可能フィルタの作成」を参照してください。フィルタクライアントは、「イメージユニット
の使用」で各種フィルタのロード方法に関する情報を見つけることができます。

メモリ管理
Core Image は Objective-C メモリ管理モデルを使用します。このモデルでは、オブジェクトの参
照がカウントされます。Core Image オブジェクトを作成すると、その参照カウントは 1 となりま
す。参照カウントをインクリメントするには、オブジェクトを保持するルーチンを呼び出し、参照カ
ウントをデクリメントするには、オブジェクトを解放するルーチンを呼び出します。参照カウントが
0 までデクリメントされると、オブジェクトが解放されます。これにより、オブジェクトは他のオブ
ジェクトへの参照を安全に共有できます。
Core Image オブジェクトを使用するときには、従うべき簡単なルールがいくつかあります。

オブジェクトを作成したりコピーしたりした場合は、それを所有することになります。一般
に、名前に「Create」または「Copy」という語のある関数からオブジェクトを取得する場合
は、用が済んだらオブジェクトを解放する必要があります。さもなければ、メモリリークが
生じます。

名前に「Create」または「Copy」という語のない関数からオブジェクトを取得する場合は、
オブジェクトへの参照を所有していないので、それを解放してはなりません。オブジェクトは
将来のある時点で所有者によって解放されます。

オブジェクトを所有していないけれども、残しておきたい場合は、オブジェクトを保持し、用
が済んだら解放する必要があります。そのためには、NSObject の retain メソッドと
release メソッドを使用します。

Objective-C におけるメモリ管理の詳細については、『Memory Management』を参照してくださ
い。

色成分とプリマルチプライ済みアルファ
プリマルチプライ済みアルファは、ソースカラーを表現するのに使用する用語であり、成分にアル
ファ値がすでに乗じてあります。プリマルチプライ処理は、各色成分の余分な乗算操作を排除するこ
とで画像のレンダリングをスピードアップします。たとえば、RGB 色空間では、プリマルチプライ
済みアルファを使用して画像をレンダリングすることで、画像の各ピクセルに対する 3 つの乗算操
作(赤×アルファ、緑×アルファ、および青×アルファ)を排除します。
フィルタクリエータは、アルファ値を事前に乗じた色成分を Core Image に渡す必要があります。さ
もなければ、フィルタは色成分のアルファ値が 1.0 であるかのように動作します。色成分を確実に
プリマルチプライ処理しておくことは、色を操作するフィルタにとって重要です。
デフォルトでは、Core Image は、処理ノードが 128 bpp(bits-per-pixel)、線光源、
GenericRGB 色空間を使用するプリマルチプライ済み RGBA 浮動小数点値であることを前提として
います。Quartz 2D CGColorSpace オブジェクトを提供することで、異なる作業用色空間を指定す
ることができます。作業用色空間は RGB ベースでなければなりません。YUV データ(または RGB
ベースでない他のデータ)を入力として利用する場合は、ColorSync 関数群を使用して作業用色空間
に変換することができます(CGColorspace オブジェクトの作成と使用については、『Quartz 2D
Programming Guide』を参照してください)。
8 ビットの YUV 4:2:2 ソースを使用することで、Core Image はギガバイトあたり 240 の HD レイ
ヤーを処理することができます。8 ビットの YUV は、DV、MPEG、非圧縮 D1、および JPEG など
のビデオソースのネイティブなカラーフォーマットです。YUV 色空間は Core Image 用の RGB 色空
間に変換する必要があります。

関連項目
Shantzis, Michael A.、『A Model for Efficient and Flexible Image Computing』(1994)、
21st Annual Conference on Computer Graphics and Interactive Techniques の議事録。
Smith, Alvy Ray、『Image Compositing Fundamentals』、Memo 4、Microsoft、1995 年 7
月、ftp://ftp.alvyray.com/Acrobat/4_Comp.pdf から入手可能。

Core Image フィルタの使用
本章では、Core Image API を使用して以下のタスクを実行する方法を示します。

「フィルタおよび属性のリストの取得」

「画像の処理」

「トランジションエフェクトの使用」

「動的な系のイメージング」

「ビデオに対するフィルタの適用」

■ フィルタおよび属性のリストの取得
Core Image は各種画像処理フィルタを Mac OS X v10.4 に提供します。いくつものフィルタがサー
ドパーティデベロッパから提供される可能性があり、システムも将来さら多くを提供する可能性があ
ります。Core Image には、利用可能なフィルタを正確に発見するのに使用できる 2 つのメソッ
ド、filterNamesOfCategory と filterNamesOfCategories があります。リストを管理しやすく
するために、フィルタは分類されています。フィルタカテゴリが分かっている場合、利用できるフィ
ルタを当該カテゴリから見つけ出すには、filterNamesOfCategory: メソッドを呼び出し、表
2-1、表 2-2、または表 2-3 の一覧に示すカテゴリ定数の 1 つを渡します。
注:Core Image フィルタおよび自分や他の開発者が作成したカスタムフィルタを含んだリストを取
得する場合は、まずカスタムフィルタが含まれているイメージユニットをロードする必要がありま
す。詳細については、「イメージユニットの使用」を参照してください。
利用可能なすべてのフィルタをカテゴリのリストから見つけ出すには、
filterNamesOfCategories: メソッドを呼び出し、表の一覧に示すカテゴリ定数の配列を渡しま

す。このメソッドは、各カテゴリについてフィルタ名を格納した NSArray を返します。すべてのカ
テゴリのすべてのフィルタのリストを取得するには、カテゴリ定数の配列の代わりに nil を渡しま
す。
フィルタは、複数のカテゴリに属することができます。カテゴリでは次のことを指定できます。

フィルタが実現するエフェクトのタイプ(色調整、歪みなど)。表 2-1 を参照してくださ
い。

フィルタの使用法(静止画、ビデオ、高ダイナミックレンジなど)。表 2-2 を参照してくだ
さい。

フィルタが Core Image で提供されているかどうか(組み込み)。表 2-3 を参照してくださ
い。

表 2-1:エフェクトタイプに関するフィルタカテゴリ定数
エフェクトタイプ

指示内容

kCICategoryDistortionEffect

歪みエフェクト(バンプ(凹凸)、渦巻き、穴など)

kCICategoryGeometryAdjustment

幾何学調整(アフィン変換、クロップ、パースペクティブ変換)

kCICategoryCompositeOperation

合成(ソースオーバー、最小、ソースアトップ、色ドッジブレンドモード
など)

kCICategoryHalftoneEffect

ハーフトーンエフェクト(点、線、平行線など)

kCICategoryColorAdjustment

色調節(ガンマ調整、ホワイトポイント調整、露出など)

kCICategoryColorEffect

カラーエフェクト(色相調整、ポスタライズなど)

kCICategoryTransition

画像間のトランジション(ディゾルブ、マスクからの分解、スワイプな
ど)

kCICategoryTileEffect

タイルエフェクト(平行四辺形、三角形、オプタイルなど)

kCICategoryGenerator

画像ジェネレータ(ストライプ、コンスタントカラー、チェッカーボード
など)

kCICategoryGradient

グラデーション(線形、放射状、ガウスなど)

kCICategoryStylize

スタイル(ピクセレート、クリスタル化など)

kCICategorySharpen

シャープ化、輝度

kCICategoryBlur

ブラー(ガウス、ズーム、モーションなど)

表 2-2:フィルタの使用法に関するフィルタカテゴリ定数
用途

指示内容

kCICategoryStillImage

静止画に使用できる

kCICategoryInterlaced

インターレース画像に使用できる

kCICategoryNonSquarePixels

非矩形ピクセルに使用できる

kCICategoryHighDynamicRange

高ダイナックレンジのピクセルに使用できる

表 2-3:フィルタの素性に関するフィルタカテゴリ定数
フィルタの素性

指示内容

kCICategoryBuiltIn

Core Image が提供するフィルタ

フィルタ名のリストを取得したら、次のように CIFilter オブジェクトを作成し、attributes メソッ
ドを呼び出すことで、フィルタの属性を取得できます。

CIFilter *myFilter;
NSDictionary *myFilterAttributes;
myFilter = [CIFilter filterWithName:@”CIExposureFilter”];
myFilterAttributes = [myFilter attributes];

文字列「CIExposureFilter」を、対象となるフィルタの名前に置き換えます。属性には、名前、カテ
ゴリ、クラス、最小、および最大などがあります。返される可能性がある属性を網羅した一覧につい
ては、『Core Image Reference』を参照してください。
フィルタ名と属性は、ユーザがフィルタを選択し、入力パラメータを制御できるユーザインターフェ
イスを構築するのに必要なすべての情報を提供します。フィルタの属性は、フィルタが持っている入
力パラメータの数、パラメータ名、データタイプ、最小値、最大値、およびデフォルト値を示しま
す。
リスト 2-1 に、フィルタ名を取得し、機能カテゴリ別にフィルタのディクショナリを構築するコー
ドを示します。このコードは、Core Image で定義されているカテゴリ
(kCICategoryGeometryAdjustment、kCICategoryDestortionEffect、kCICategorySharpen、
および kCICategoryBlur)ごとにフィルタを取得しますが、アプリケーションで定義されている機
能カテゴリ(Distortion と Focus)に基づいてディクショナリを構築します。機能カテゴリは、
ユーザにとって意味のあるメニューにフィルタ名を編成するのに役立ちます。このコードでは、可能
なすべての Core Image フィルタカテゴリを反復処理するわけではありませんが、このコードは同
じプロセスに従って簡単に拡張することができます。

リスト 2-1:フィルタのディクショナリを機能カテゴリ別に構築するコード
categories = [[NSMutableDictionary alloc] init];
NSMutableArray

*array;

array = [NSMutableArray arrayWithArray:
[CIFilter filterNamesInCategory:
kCICategoryGeometryAdjustment]];
[array addObjectsFromArray:
[CIFilter filterNamesInCategory:
kCICategoryDistortionEffect]];
[categories setObject:[self buildFilterDictionary:array]
forKey:@"Distortion"];

array = [NSMutableArray arrayWithArray:
[CIFilter filterNamesInCategory:kCICategorySharpen]];
[array addObjectsFromArray:
[CIFilter filterNamesInCategory:kCICategoryBlur]];
[categories setObject:[self buildFilterDictionary:array]
forKey:@"Focus"];

リスト 2-2 に、リスト 2-1 で呼び出される buildFilterDictionary ルーチンを示します。この
ルーチンは、機能カテゴリの各フィルタについて属性のディクショナリを構築します。コードで番号
を付けた各行については、リストの後に詳しく説明します。

リスト 2-2:フィルタのディクショナリを機能名別に構築する
- (NSMutableDictionary *)buildFilterDictionary:(NSArray *)names
{
NSMutableDictionary

*td, *catfilters;

NSDictionary

*attr;

NSString

*classname;

CIFilter

*filter;

int

// 1

i;

catfilters = [NSMutableDictionary dictionary];

for(i=0 ; i<[names count] ; i++)
{

// 2

classname = [names objectAtIndex:i];

// 3

filter = [CIFilter filterWithName:classname];

// 4

if(filter)
{
attr = [filter attributes];

td

// 5

= [NSMutableDictionary dictionary];

[td setObject:classname forKey:@"class"];

// 6

[catfilters setObject:td
forKey:[attr objectForKey:@"name"]];
}
else
NSLog(@" could not create '%@' filter", classname);
}

// 7

return catfilters;
}

このコードが実行することを以下に示します。
1.

フィルタ名の配列を入力パラメータとして受け取ります。リスト 2-1 から、この配列が複数
の Core Image フィルタカテゴリからのフィルタ名を連結したものになることを思い出してく
ださい。この例では、配列はアプリケーションで設定した機能カテゴリ(Distortion または
Focus)に基づいています。

2.

配列内のフィルタ名の数だけ配列の反復処理を行います。

3.

names 配列からフィルタ名を取り出します。

4.

フィルタ名に対するフィルタオブジェクトを取り出します。

5.

フィルタの属性ディクショナリを取り出します。

6.

フィルタ属性ディクショナリの名前を設定します。

7.

当該フィルタのフィルタ属性ディクショナリをカテゴリフィルタディクショナリに追加しま
す。

アプリケーションがユーザインターフェイスを提供する場合は、フィルタディクショナリを参照し
て、ユーザインターフェイスを作成、更新できます。たとえば、ブール型のフィルタ属性はチェック
ボックスまたは類似のユーザインターフェイス要素を必要とし、一定範囲にわたって連続的に変化す
る属性はスライダーを使用することができます。最大値および最小値はテキストラベルの基準として
使用できます。デフォルトの属性設定は、ユーザインターフェイスの初期設定を決定するものとなり
ます。

画像の処理
Core Image フィルタを使用して画像を処理する手順は次のとおりです。
1.

CIContext オブジェクトを作成する。

2.

処理対象の画像を取得する。

3.

画像に適用するフィルタに対するフィルタオブジェクトを作成する。

4.

フィルタのデフォルト値を設定する。

5.

フィルタパラメータを設定する。

6.

1 つ以上のフィルタを適用する。

7.

画像を描画する。

各手順の実行の詳細については、以降のセクションを参照してください。図 2-1 に示す画像に 3 つ
のフィルタを適用する方法を説明します。

図 2-1:オリジナルの画像

このセクションの内容:
Core Image コンテキストの作成
処理対象画像の取得
フィルタの作成、設定、適用
結果の描画

Core Image コンテキストの作成
Core Image では、描画デスティネーションを表現する Core Image コンテキストに対して画像が
評価されます。Core Image コンテキストは次の方法で作成できます。

NSGraphicsContext メソッド CIContext を呼び出す

Quartz 2D グラフィックコンテキストから

OpenGL グラフィックコンテキストから

Core Image コンテキストはビュー単位ではなく、ウインドウ単位で作成します。
NSGraphicsContext のメソッド CIContext は、NSGraphicsContext のレンダリングに使用でき
る CIContext オブジェクトを返します。CIContext オブジェクトは要求に応じて作成され、当該オ
ブジェクトを所有する NSGraphicsContext が存続するかぎり存在します。Core Image コンテキス
トは、次のようなコード行を使用して作成します。
[[NSGraphicsContext currentContext] CIContext]

このメソッドの詳細については、『NSGraphicsContext』を参照してください。
Quartz 2D グラフィックコンテキストから Core Image コンテキストを作成するには、リスト 2-3
に示すようなコードを使用します。これは Cocoa アプリケーションの drawRect ルーチンから抜粋
したものです。現在の NSGraphicsContext を取得して、Quartz 2D グラフィックコンテキスト
(CGContextRef)に変換し、その Quartz 2D グラフィックコンテキストを引数として
contextWithCGContext に渡します。Quartz 2D グラフィックコンテキストについては、『Quartz

2D Programming Guide』を参照してください。

リスト 2-3:Quartz 2D グラフィックコンテキストから Core Image コンテキストを作成する
if(context == nil)
{
context = [CIContext contextWithCGContext:
[[NSGraphicsContext currentContext] graphicsPort]
options:nil]
[context retain];}

リスト 2-4 に、現在の OpenGL グラフィックコンテキストから Core Image コンテキストをセッ
トアップする方法を示します。

リスト 2-4:OpenGL グラフィックコンテキストから Core Image コンテキストを作成する
CIContext *myCIContext;
myCIContext = [CIContext contextWithCGLContext:CGLGetCurrentContext()
options:nil];

処理対象画像の取得
Core Image フィルタは Core Image 画像(CIImage)を処理します。表 2-4 に、Core Image 画
像を作成するメソッドの一覧を示します。使用するメソッドは画像のソースによって決まります。

表 2-4:画像の作成に使用するメソッド
画像ソース

メソッド

URL

imageWithContentsOfURL: imageWithContentsOfURL:options:

Quartz 2D 画像

imageWithCGImage: imageWithCGImage:options

(CGImageRef)
Quartz 2D レイヤー

imageWithCGLayer: imageWithCGLayer:options:

(CGLayerRef)
OpenGL テクスチャ

imageWithTexture:size:flipped:colorSpace:

未加工データ

imageWithBitmapData:bytesPerRow:size:format:colorSpace:
imageWithImageProvider:size:width:format:colorSpace:opti
ons:

NSCIImageRep

initWithBitmapImageRef:これは Application Kit 機能追加です。

詳細については、NSCIImageRep を参照してください。
エンコードされたデータ

imageWithData: imageWithData:options:,

(メモリ内の画像)
CVImageBuffer

imageWithCVImageBuffer: imageWithCVImageBuffer:options:

フィルタの作成、設定、適用
リスト 2-5 に、色相フィルタを作成、設定、および適用する方法を示します。filterWithName: メ
ソッドを使用してフィルタを作成します。作成するフィルタのタイプは、name 引数に指定します。
色相調整フィルタは CIHueAdjust という名前です。「フィルタおよび属性のリストの取得」の説明

に従ってフィルタ名のリストを取得するか、「Core Image フィルタ」の中でフィルタ名を探せま
す。フィルタを最初に作成するときにはフィルタの入力値が未定義なので、setDefaults メソッド
を呼び出してデフォルト値を設定するか、フィルタを作成する時点で
filterWithName:keysAndValues メソッド呼び出してすべての入力パラメータに値を提供する必要

があります。
フィルタの入力パラメータが分からない場合は、inputKeys メソッドを使用して、それらの配列を
取得することができます(あるいは、「Core Image フィルタ」の中で大半の組み込みフィルタの入
力パラメータを探せます)。デフォルト値を変更したい各入力パラメータに値を設定するには、
setValue:forKey: メソッドを呼び出します。

リスト 2-5 では、2 つの入力パラメータ(入力画像と入力角度)を設定します。フィルタは、ジェ
ネレータフィルタを除き、入力画像を必要とします。中には、複数の画像またはテクスチャを必要と
するフィルタもあります。色相調整フィルタの入力角度は、HSV および HLS 色空間における色相の
位置を指します。これは 0.0 ∼ 2 pi までの範囲の角度です。値 0 は赤色を示し、緑色は pi/3 ラジ
アンに相当し、青色は 2/3 pi ラジアンです。
リスト 2-5 の最終行は、outputImage キーに対応する値を取得することで、フィルタを画像に適用
します。出力画像を要求すると、Core Image が入力パラメータを評価し、結果の画像を生成するの
に必要な計算を格納します。画像は実際にはレンダリングされません。別のフィルタを適用し、結果
のレンダリングを行うまでフィルタをさらに適用するプロセスを継続できます。

リスト 2-5:色相フィルタの作成、設定、適用
hueAdjust = [CIFilter filterWithName:@"CIHueAdjust"];
[hueAdjust setDefaults];
[hueAdjust setValue:myCIImage forKey:@"inputImage"];
[hueAdjust setValue:[NSNumber numberWithFloat:2.094]
forKey:@"inputAngle"];
result = [hueAdjust valueForKey:@"outputImage"];

リスト 2-5 のコードを使用して図 2-1 の画像を処理すると、その結果は図 2-2 に示すようになり
ます。次は、さらに 2 つのフィルタ、すなわち暗影(CIGloom)とバンプ歪み
(CIBumpDistortion)を画像に適用する方法を示します。
暗影フィルタはまさに名前のとおりのことをします。つまり、ハイライトを鈍くすることで、画像を
暗くします。リスト 2-6 のコードは、リスト 2-5 に示すコードと非常に似ています。このコードは

フィルタを作成し、暗影フィルタのデフォルト値を設定します。今度は、色相調整フィルタの出力画
像が入力画像となります。フィルタの連結はこれほど簡単なことなのです。

図 2-2:色調節フィルタ適用後の画像

暗影フィルタには 2 つの入力パラメータがあります。デフォルト値を使用することも可能ですが、
このコードでは入力半径を 25 に設定し、入力強度を 0.75 に設定しています。入力半径はエフェク
トの範囲を指定するもので、0 ∼ 100 までの範囲を指定でき、デフォルト値は 10 です。プログラ
ムの中でフィルタの属性ディクショナリを取得することで、フィルタの最大値、最小値、およびデ
フォルト値を知ることができることを思い出してください。
入力強度は、フィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値です。最小値は
0.0、最大値は 1.0、デフォルト値は 1.0 です。

リスト 2-6:暗影フィルタの作成、設定、適用
gloom = [CIFilter filterWithName:@"CIGloom"];
[gloom setDefaults];
[gloom setValue:result forKey:@"inputImage"];
[gloom setValue:[NSNumber numberWithFloat:25]
forKey:@"inputRadius"];
[gloom setValue:[NSNumber numberWithFloat:0.75]
forKey:@"inputIntensity"];
result = [gloom valueForKey:@"outputImage"];

このコードは結果を得ますが、画像を描画しません。画像の描画方法については、次のセクション
で説明します。図 2-3 は、色相調整および暗影フィルタで画像を処理した後の現時点で描画する
と、どのように見えるかを示します。

図 2-3:色相調整および暗影フィルタ適用後の画像

バンプ歪みフィルタ(CIBumpDistortion)は、画像の指定したポイントに膨らみ(バンプ)を持た
せます。リスト 2-7 に、このフィルタを作成、設定し、前のフィルタ(暗影フィルタ)からの出力

画像に適用する方法を示します。ここまでくれば、エキスパートになっているはずです。まず、名前
を付けてフィルタを作成します。次に、デフォルトを設定し、前の結果を入力画像として設定しま
す。バンプ歪みは 3 つのパラメータ、すなわちエフェクトの中心を指定する位置、エフェクトの半
径、および入力スケールを受け取ります。入力スケールでは、エフェクトの方向と量を指定します。
デフォルト値は -0.5 です。範囲は -10.0 ∼ 10.0 です。値 0 はエフェクトなしを指定します。負
の値は凸状の膨らみを持たせ、正の値は凹上の膨らみになります。

リスト 2-7:バンプ歪みフィルタの作成、設定、適用
bumpDistortion = [CIFilter filterWithName:@"CIBumpDistortion"];
[bumpDistortion setDefaults];
[bumpDistortion setValue:result forKey:@"inputImage"];
[bumpDistortion setValue:[CIVector vectorWithX:200 Y:150

]

forKey:@"inputCenter"];
[bumpDistortion setValue:[NSNumber numberWithFloat:100]
forKey:@"inputRadius"];
[bumpDistortion setValue:[NSNumber numberWithFloat:3.0]
forKey:@"inputScale"];
result = [bumpDistortion valueForKey:@"outputImage"];

結果の描画
結果を描画すると、プロセッサ(GPU または CPU)に負荷のかかる操作が開始されます。Core
Image は描画用に 2 つのメソッドを用意しています。

drawImage:atPoint:fromRect: は、画像の特定の領域をコンテキストデスティネーション

の特定のポイントにレンダリングします。

drawImage:inRect:fromRect: は、画像の特定の領域をコンテキストデスティネーションの

特定の矩形にレンダリングします。

次のコードは、前のセクションで色相調整、暗影フィルタ処理、バンプ変形された画像をレンダリン
グします。
[myCIContext drawImage:result
atPoint:CGPointZero
fromRect:contextRect];

図 2-4 に、レンダリングした画像を示します。この場合、Core Image は (0,0)(CGPointZero)
に画像を描画し、コンテキストデスティネーション全体に描画します。

図 2-4:色相調整フィルタ、暗影フィルタ、およびバンプ歪みフィルタ適用後の画像

トランジションエフェクトの使用
トランジションは一般的に、スライドショーの画像間で使用したり、ビデオでシーンを切り替えるの
に使用します。これらのエフェクトは時間の経過に伴ってレンダリングされるため、タイマーを設定
する必要があります。このセクションでは、コピーマシントランジションフィルタ
(CICopyMachine) を設定し、2 つの静止画に適用する方法を示します。コピーマシントランジショ
ンは、複写機に見られるような光の帯を演出します。光の帯が最初の画像を通過して、ターゲット画
像が表示されます。図 2-5 に、スキーブーツの画像がスキーヤーの画像に変化する前、その途中、
および変化した後で、このフィルタがどのように見えるかを示します。

図 2-5:スキーブーツからスキーヤーへのコピーマシントランジション

トランジションフィルタでは、以下のタスクが必要になります。
1.

トランジションに使用する Core Image 画像を作成する。

2.

タイマーを用意して、予定を設定する。

3.

CIContext オブジェクトを作成する。

4.

画像に適用するフィルタに対するフィルタオブジェクトを作成する。

5.

フィルタのデフォルト値を設定する。

6.

フィルタパラメータを設定する。

7.

処理対象となるソースおよびターゲット画像を設定する。

8.

時間を計算する。

9.

フィルタを適用する。

10. 結果を描画する。
11. トランジションが完了するまで、手順 8 ∼ 10 を繰り返す。

お気付きでしょうが、これらのタスクの多くは、トランジションフィルタ以外のフィルタを使用した
画像の処理に必要なタスクと同じです。異なるのは、タイマーを用意し、トランジションが完了す
るまでさまざまな時間間隔でエフェクトを繰り返し描画する必要があることです。
リスト 2-8 に示す awakeFromNib メソッドは、2 つの画像(boots.jpg と skier.jpg)を取得
し、ソースおよびターゲット画像として設定します。NSTimer を使用して、1/30 秒ごとに繰り返す
ようにタイマーを設定します。変数 thumbnailWidth と thumbnailHeight に注目してください。
これらの変数は、レンダリングした画像を Interface Builder で用意したビューに収めるために使用
します。
注:Mac OS X v10.4 で導入された NSAnimation クラスは、Cocoa におけるアニメーションのタ
イミングを実装します。NSTimer の代わりに NSAnimation を使用すると、タイミングデバイスを
1 つだけ使用して、複数のスライドショーで同時にトランジションを再生するように設定できます。
詳細については、『NSAnimation』、『Animating Views and Windows』、および『Timing
Animations』の各ドキュメントを参照してください。

図 2-8:画像の取得とタイマーの設定
- (void)awakeFromNib
{
NSTimer

*timer;

NSURL

*url;

thumbnailWidth

= 340.0;

thumbnailHeight = 240.0;

url

= [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:@"boots" ofType:@"jpg"]];

[self setSourceImage:[CIImage imageWithContentsOfURL:url]];

url

= [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:@"skier" ofType:@"jpg"]];

[self setTargetImage:[CIImage imageWithContentsOfURL:url]];

timer = [NSTimer scheduledTimerWithTimeInterval:1.0/30.0
target:self
selector:@selector(timerFired:)
userInfo:nil
repeats:YES];

base = [NSDate timeIntervalSinceReferenceDate];
[[NSRunLoop currentRunLoop] addTimer:timer
forMode:NSDefaultRunLoopMode];

[[NSRunLoop currentRunLoop] addTimer:timer
forMode:NSEventTrackingRunLoopMode];
}

他のフィルタを設定したように、トランジションフィルタを設定します。リスト 2-9 では、
filterWithName: メソッドを使用してフィルタを作成します。次に、setDefaults を呼び出し、入

力パラメータをすべて初期化します。このコードでは、リスト 2-8 に示す awakeFromNib: ルーチ
ンで宣言したサムネイルの幅と高さと一致するように範囲を設定します。
このルーチンはサムネイル変数を使用して、エフェクトの中心を指定します。この例では、エフェク
トの中心は画像の中心ですが、そうである必要はありません。

リスト 2-9:トランジションフィルタの設定
- (void)setupTransition
{
CIVector

*extent;

float

w,h;

int

i;

w

= thumbnailWidth;

h

= thumbnailHeight;

extent = [CIVector vectorWithX:0
transition

Y:0

[transition setValues:extent
forKey:@”inputExtent”];

}

W:h];

= [CIFilter filterWithName:@"CICopyMachineTransition"];

[transition setDefaults];

[transition

Z:w

retain];

コピーマシントランジションエフェクト用の drawRect ルーチンをリスト 2-10 に示します。この
ルーチンは、ビューと同じサイズの矩形を用意し、レンダリング時間用の浮動小数点値を用意しま
す。CIContext がまだ作成されていなければ、このルーチンが作成します。トランジションがまだ設
定されていなければ、このルーチンが setupTransition メソッドを呼び出します(リスト 2-9 を
参照)。最後に、このルーチンは drawImage:atPoint:fromRect: メソッドを呼び出し、レンダリ
ング時に表示する画像を渡します。リスト 2-11 に示す imageForTransition メソッドはフィルタ
を適用し、レンダリング時の適切な画像を返します。

リスト 2-10:コピーマシントランジションエフェクトの drawRect ルーチン
- (void)drawRect:(NSRect)rectangle
{
float

t;

CGRect

cg = CGRectMake(NSMinX(rectangle), NSMinY(rectangle),
NSWidth(rectangle), NSHeight(rectangle));

t

= 0.4*([NSDate timeIntervalSinceReferenceDate] - base);

if(context == nil)
{
context = [CIContext contextWithCGContext:
[[NSGraphicsContext currentContext] graphicsPort]
options:nil];
[context retain];
}
if(transition == nil)
[self setupTransition];
[context drawImage:[self imageForTransition:t + 0.1]
atPoint:cg.origin
fromRect:cg];
}

imageForTransition: ルーチンは、レンダリング時間に基づいて、どの画像がソース画像で、どれ

がターゲット画像であるかを判断します。そしてトランジションが繰り返しループできるように設定
します。アプリケーションでループしないトランジションを適用する場合、リスト 2-11 に示す ifelse 部分は必要ありません。
ルーチンは、imageForTransition: ルーチンに渡されるレンダリング時間に基づいて inputTime
値を設定します。トランジションを適用し、トランジションの出力画像をクロップフィルタ
(CICrop)に渡します。クロップにより、出力画像がビュー矩形に収まります。ルーチンはクロッ
プした画像を drawRect メソッドに返すと、メソッドは画像を描画します。

リスト 2-11: トランジションフィルタの適用
- (CIImage *)imageForTransition:(float)t
{
CIFilter

*crop;

if(fmodf(t, 2.0) < 1.0f)
{
[transition setValue:sourceImage

forKey:@"inputImage"];

[transition setValue:targetImage

forKey:@"inputTargetImage"];

[transition setValue:targetImage

forKey:@"inputImage"];

[transition setValue:sourceImage

forKey:@"inputTargetImage"];

}
else
{

}
[transition setValue:[NSNumber numberWithFloat:
0.5*(1-cos(fmodf(t, 1.0f) * M_PI))]
forKey:@"inputTime"];

crop = [CIFilter filterWithName:@"CICrop"
keysAndValues:@"inputImage",
[transition valueForKey:@"outputImage"],
@"inputRectangle", [CIVector vectorWithX:0

Y:0

Z:thumbnailWidth
W:thumbnailHeight],
nil];
return [crop valueForKey:@"outputImage"];
}

設定したタイマーが発行するたびに、表示を更新する必要があります。リスト 2-12 に、まさにこ
れを実行する timerFired ルーチンを示します。

リスト 2-12:タイマーを使用して表示を更新する
- (void)timerFired:(id)sender
{
[self setNeedsDisplay:YES];
}

最後に、アプリケーションでソース画像とターゲット画像を(例のように)切り替える場合に実行
する必要がある管理処理をリスト 2-13 に示します。

リスト 2-13:ソース画像およびターゲット画像の設定
- (void)setSourceImage:(CIImage *)source
{
[source retain];
[sourceImage release];
sourceImage = source;
}

- (void)setTargetImage:(CIImage *)target
{
[target retain];
[targetImage release];
targetImage = target;
}

動的な系のイメージング
動的な系とは、系の現在の状態に基づいた計算を使用して、その状態が時間の経過に伴って変化す
る系です。複雑な現象(流体力学、恒星の形成、サックスの重音、自己最適化システムなど)は通
常、出力がグラフィック形式で表示される反復関数を使用してモデル化されます。動的な系のイメー
ジングには、系の出力を入力にフィードバックする方法が必要です。このような系のイメージング
は、「画像の処理」に示したように、多数のフィルタを連結するように単純ではありません。むし
ろ、次の反復に作用するように、画像出力を累積する方法が必要です。Core Image は、まさにこの
ための CIImageAccumulator クラスを用意しています。イメージアキュムレータにより、流体力学
シミュレーションで必要となるような反復ペイント操作のような、フィードバックを利用した画像
処理が可能になります。
このセクションのコードはイメージアキュムレータを使用する方法を示しますが、動的な系をモデル
化するほど複雑なものではありません。その代わりに、イメージアキュムレータを使用して、
MicroPaint という単純なペイントアプリケーションを実装する方法について説明します。ユーザは
キャンバス上でマウスをドラッグして、ペンキを適用します。ボタンを押すだけで、少量のペンキが

スプレーされます。ユーザは、カラーウエルを使用して色を変更できます。ユーザは、図 2-6 に示
すような出力を作成することができます。

図 2-6:MicroPaint の出力

「画像」は空のキャンバスから始まります。MicroPaint はイメージアキュムレータを使用して、
ユーザが適用したペンキを集めます。ユーザが「Clear」をクリックすると、MicroPaint はイメージ
アキュムレータをリセットして白いキャンバスに戻します。MicroPaint アプリケーションでのイ
メージアキュムレータの使用に不可欠な 3 つのタスクは次のとおりです。
1.

「イメージアキュムレータを作成して初期化する」

2.

「イメージアキュムレータにフィルタを設定して適用する」

3.

「CIContext を作成して画像を描画する」

MicroPaint アプリケーションのインターフェイスファイルをリスト 2-14 に示します。マウス位置
の取得およびユーザインターフェイスの更新を行うルーチンについては、ここでは述べません。ADC
Reference Library(Graphic and Imaging Sample Code)のサンプルコードセクションから完全
な MicroPaint アプリケーションを入手し、ユーザインターフェイスルーチンの実装方法を確認する
ことができます。イメージアキュムレータを設定して使用するのに必要なタスクについては、以降の
セクションで説明します。

リスト 2-14:MicroPaintView のインターフェイス
@interface MicroPaintView :NSView
{
BOOL initialized;
NSBundle *bundle;
CIImageAccumulator *_canvas;
// ユーザインターフェイス
NSColor *color;
IBOutlet NSColorWell *colorWell;
IBOutlet NSButton *clearButton;
// ブラシを追跡し、ペンキを等間隔に塗るための処理
NSPoint lastPt;
float lastPressure;
float distance;
}
- (void)awakeFromNib;
- (void)drawRect:(NSRect)r;
- (void)deposit:(NSPoint)pt pressure:(float)pressure;
- (IBAction)colorWellAction:(id)sender;
- (IBAction)clearButtonAction:(id)sender;

@end

イメージアキュムレータを作成して初期化する
リスト 2-15 に示す canvas ルーチンは、イメージアキュムレータを作成して初期化します。イメー
ジアキュムレータの境界は、32 bpp(bit-per-pixel)、固定小数点のピクセル形式
(kCIFormatARGB8)を使用して、ビューの境界に設定されます。ルーチンは、白色のコンスタント

カラージェネレータフィルタの設定と初期化も行います。その後、コンスタントカラーフィルタの出
力を使用して、イメージアキュムレータ画像を初期化します。canvas ルーチンは、最初にアプリ
ケーションが起動したとき、およびユーザがクリアボタンをクリックしたときにいつでも、空(白
色)のキャンバスを設定します。それ以外の場合、このルーチンは現在のイメージアキュムレータを
返します。

リスト 2-15:イメージアキュムレータを作成して初期化する
- (CIImageAccumulator *)canvas
{
CGRect r;
CIFilter *f;
NSRect bounds;

if (_canvas == nil)
{
bounds = [self bounds];
r = CGRectMake(bounds.origin.x, bounds.origin.y,
bounds.size.width, bounds.size.height);
_canvas = [[CIImageAccumulator alloc] initWithExtent:r
format:kCIFormatARGB8];
f = [CIFilter filterWithName:@"CIConstantColorGenerator"
keysAndValues:@"inputColor",
[CIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0],
nil];
[_canvas setImage:[f valueForKey:@"outputImage"]];
}
return _canvas;
}

イメージアキュムレータにフィルタを設定して適用する
MicroPaint には、キャンバスにペンキを適用する独自のフィルタ(塗りフィルタ)が用意されてい
ます。このフィルタは、マウス(またはペン)の位置、ブラシサイズとブラシ間隔(アプリケーショ
ンで定義された定数)、および圧力(ユーザが感圧デバイスでペイントする場合に変化する)に基
づいてペンキを適用する場所と量を計算します。
塗りフィルタは MicroPaint アプリケーションバンドルの一部です。その実装については、ここでは
述べません。独自のフィルタを作成して使用する場合は、「カスタムフィルタおよびイメージユニッ
トの作成と使用」を参照してください。
マウスダウンイベントまたはマウスドラッグイベントが発生するといつでも、リスト 2-16 に示す
deposit:pressure: ルーチンが呼び出されます。コードで番号を付けた各行については、リストの

後に詳しく説明します。

リスト 2-16:累積画像に塗りフィルタを設定して適用する
- (void)deposit:(NSPoint)pt pressure:(float)pressure
{
CIFilter *f;
CGRect r;

f = [CIFilter filterWithName:@"DabFilter"];
// 1
[f setValue:[CIVector vectorWithX:pt.x Y:pt.y]
// 2
forKey:@"inputCenter"];
[f setValue:[CIColor colorWithRed:[color redComponent]
green:[color greenComponent]
blue:[color blueComponent] alpha:1.0]
forKey:@"inputColor"];

[f setValue:[NSNumber numberWithFloat:brushsize * 0.5]
forKey:@"inputRadius"];

[f setValue:[NSNumber numberWithFloat:pressure]
forKey:@"inputOpacity"];
[f setValue:[[self canvas] image]
// 3
forKey:@"inputImage"];
r.origin = CGPointMake(pt.x - brushsize * 0.5,
pt.y - brushsize * 0.5);
// 4
r.size = CGSizeMake(brushsize, brushsize);
[[self canvas] setImage:[f valueForKey:@"outputImage"] dirtyRect:r];
// 5
[self setNeedsDisplay:YES];
// 6
}

このコードが実行することを以下に示します。
1.

塗りフィルタのフィルタを作成します。注:塗りフィルタはアプリケーションで作成するカス
タムフィルタです。カスタムフィルタを使用するプロセスは、Core Image フィルタを使用す
る場合と同じです。フィルタに割り当てられた名前を使用して CIFilter を作成し、入力値を設
定し、出力画像を取得します。フィルタをイメージユニットとしてパッケージ化した場合は、
まずそれをロードする必要があります。詳細については、「イメージユニットの使用」を参照
してください。

2.

塗りフィルタの入力値を設定する。

3.

イメージアキュムレータ画像を入力画像として塗りフィルタに設定する。

4.

ダーティ矩形を計算する。ダーティ矩形は、マウスの位置とアプリケーションで設定したブラ
シサイズに基づく。

5.

イメージアキュムレータ画像を塗りフィルタの出力(ただし、ダーティ矩形が指定する領域の
み)に設定する。

6.

更新する表示を設定する。ビューの drawRect: ルーチンを呼び出します。

CIContext を作成して画像を描画する
deposit:pressure: ルーチンが更新対象の表示を設定すると、リスト 2-17 に示す drawRect:

ルーチンが呼び出されます。コードで番号を付けた各行については、リストの後に詳しく説明しま
す。

リスト 2-17:MicroPaint アプリケーションの drawRect ルーチン
- (void)drawRect:(NSRect)rect
{
CGRect cg;
CIContext *context = [[NSGraphicsContext currentContext] CIContext];
// 1
cg = CGRectMake(NSMinX(rect), NSMinY(rect),
NSWidth(rect), NSHeight(rect));
[context drawImage:[[self canvas] image]
// 2
atPoint:cg.origin
fromRect:cg];
}

このコードが実行することを以下に示します。
1.

NSGraphicsContext の CIContext メソッドを呼び出すことで、Core Image コンテキスト
を作成します。コンテキストは一度だけ作成する必要があります。可能な場合は、必ず
CIContext を再利用してください。

2.

イメージアキュムレータから返された画像を原点 (0,0) に描画します。このとき、ビューの
サイズ全体を使用します。

ヒント:アプリケーション実行ループに戻らずに、Core Image を繰り返し呼び出す場合は、それぞ
れの Core Image 呼び出しのかたまりを専用の自動解放プールで囲むのが最善です。このようにす
ることで、アプリケーションが必要以上にメモリを使用しないようにします。画像を操作する場合、
これは重要です。

ビデオに対するフィルタの適用
Core Image と Core Video は連携して、さまざまなエフェクトを実現することができます。たとえ
ば、水面下で撮影したビデオに色補正フィルタを使用して、水が緑色光および青色光よりも速く赤色
光を吸収するという事実を補正できます。このような技術を併用できる方法はほかにもたくさんあ
ります。
Core Video を使用して表示するビデオに Core Image フィルタを適用するには、次の手順に従って
ください。
1.

NSView をサブクラス化してビデオのビューを作成するときに、次のコードに示すように、イ

ンターフェイスの中で CIFilter を宣言します。
@interface MyVideoView :NSView
{
NSRecursiveLock *lock;
QTMovie

*qtMovie;

QTVisualContextRef

qtVisualContext;

CVDisplayLinkRef

displayLink;

CVImageBufferRef

currentFrame;

CIFilter

*effectFilter;

id

delegate;

}

2.

ビューをフレームで初期化するとき、次のようなコードを使用してフィルタを作成し、デフォ
ルト値を設定します。

effectFilter = [[CIFilter filterWithName:@"CILineScreen"] retain];
[effectFilter setDefaults];

   この例では Core Image のフィルタである CILineScreen を使用していますが、アプリケー
ションにとって適切な任意のフィルタを使用できます。
3.

入力画像を除き、フィルタ入力パラメータを設定します。

4.

フレームをレンダリングするたびに、入力画像を設定し、出力画像を描画する必要がありま
す。renderCurrentFrame ルーチンは次のようなものになります。この例では、補間を避け

   るために、出力を描画する際に整数座標を使用しています。
- (void)renderCurrentFrame
{
NSRect

frame = [self frame];

if(currentFrame)
{
CGRect

imageRect;

CIImage

*inputImage, *outputImage;

inputImage = [CIImage imageWithCVImageBuffer:currentFrame];
imageRect = [inputImage extent];
[effectFilter setValue:inputImage forKey:@"inputImage"];
[[[NSGraphicsContext currentContext] CIContext]
drawImage:[effectFilter valueForKey:@"outputImage"]
atPoint:CGPointMake(
(int)((frame.size.width - imageRect.size.width) * 0.5),
(int)((frame.size.height - imageRect.size.height) * 0.5))
fromRect:imageRect];
}
}

5.

dealloc メソッドでは、必ずフィルタを解放するようにします。

カスタムフィルタおよびイメージユニットの作成
と使用
Core Image の提供するフィルタに必要な機能がない場合は、独自にフィルタを作成することができ
ます。フィルタをアプリケーションプロジェクトの一部として含めたり、1 つ以上のフィルタをスタ
ンドアロンのイメージユニットとしてパッケージ化することができます。イメージユニットは
NSBundle を使用し、フィルタのプラグインアーキテクチャを表します。
「Core Image の概念」では、CPU 実行可能フィルタと、CPU 非実行可能フィルタがあることを説
明しています。イメージユニットには、どちらの種類のフィルタも含めることができます。CPU 非実
行可能フィルタは、ウイルスやトロイの木馬に隠れ場所を提供しないので安全です。セキュリティ意
識のあるフィルタクライアントは、CPU 非実行可能フィルタのみを使用したいと思うかもしれませ
ん。CPU 非実行可能フィルタを作成する予定の場合は、非実行可能フィルタの要件について詳しく
述べたセクションを必ず読んでください。
以下のセクションでは、カスタムフィルタおよびイメージユニットの作成と使用の方法に関する詳細
な情報を提供します。

「Core Image における画像処理操作の表現」では、簡単に表現できる操作、表現するのが難
しい操作、および未解決の問題を引き起こす操作について説明します。

「カスタムフィルタの作成」

「カスタムフィルタの使用」

「ROI 関数の提供」

「非実行可能フィルタの作成」

「カスタムフィルタをイメージユニットとしてパッケージ化する」

「イメージユニットの使用」

■ Core Image における画像処理操作の表現
Core Image は、カーネル(すなわち、ピクセル単位の処理ルーチン)を計算として記述することで
動作します。その計算では、カーネルの入力画像の対応するピクセルへの逆マッピングを使用するこ
とで出力ピクセルを表現します。ほとんどのピクセル計算はこの方法で表現できますが(一部はほか
よりも自然に表現できるものもあります)、不可能ではないにしても、これが難しい画像処理操作
もあります。フィルタを作成する前に、画像処理操作を Core Image で表現できるかどうかを検討
してください。たとえば、ヒストグラムの計算をソース画像への逆マッピングとして記述するのは困
難です。

カスタムフィルタの作成
画像処理フィルタの核心は、ピクセル計算を実行するカーネルです。このセクションでは、
Objective-C 部分とカーネル部分を持つ Core Image フィルタを作成する方法について説明しま
す。このセクションに示す手順に従って、CPU 実行可能なフィルタを作成します。作成したフィルタ
と、必要に応じて他のフィルタをイメージユニットとしてパッケージ化するには、「カスタムフィル
タをイメージユニットとしてパッケージ化する」の手順に従います。あるいは、単にアプリケーショ
ンの中でフィルタを使用することができます。詳細については、「カスタムフィルタの使用」を参照
してください。
このセクションのフィルタは、関心領域(ROI)と定義領域が一致するものと仮定しています。この
仮定が当てはまらないフィルタを作成する場合は、必ず「ROI 関数の提供」も読んでください。
カスタムの CPU 実行可能フィルタを作成するには、次の手順を実行します。
1.

「カーネルコードを記述する」

2.

「Quartz Composer を使ってカーネルルーチンをテストする」

3.

「フィルタのインターフェイスを宣言する」

4.

「フィルタとその属性を登録する」

5.

「画像出力メソッドを記述する」

6.

「フィルタのインスタンスを作成するメソッドを記述する」

以降のセクションでは、一例としてかすみ除去フィルタを取り上げて、各ステップを詳細に説明しま
す。かすみ除去フィルタの効果は、画像の輝度とコントラストを調整すること、そしてシャープニン
グを画像に適用することです。このフィルタは、薄い霧または霞を通して撮影された画像の修正に役
立ちます。たとえば、飛行機から撮影を行うと、よくそのようになります。図 3-1 に、かすみ除去
フィルタで処理する前後の画像を示します。フィルタを使用するアプリケーションでは、ユーザが
フィルタに適用する入力パラメータを調節するスライダーを用意します。

図 3-1:かすみ除去フィルタで処理する前後の画像

カーネルコードを記述する
ピクセル単位の処理を実行するコードは、.cikernel 拡張子の付いたファイルにあります。この
ファイルには、複数のカーネルルーチンを含めることができます。コードをモジュール化するため
に、他の関数を含めることもできます。OpenGL Shading Language のサブセットおよび Core
Image 拡張機能を使用して、カーネルを指定します。言語の使用可能な要素については、「Core
Image カーネル言語」を参照してください。
カーネルルーチンシグネチャは、ソースをデスティネーションにマッピングした結果を含んだベクト
ル(vec4)を返す必要があります。Core Image はピクセルごとに一度だけカーネルルーチンを呼び
出します。コードでは、ピクセルからピクセルへ処理が移るときに情報を蓄積できないことに留意し
てください。コード記述時の戦略としてよいのは、実際のカーネルからできるだけ多くの不変計算を
移動し、フィルタの Objective-C 部分に配置することです。
リスト 3-1 に、かすみ除去フィルタのカーネルルーチンを示します。コードで番号を付けた各行に
ついては、リストの後に詳しく説明します。

リスト 3-1:かすみ除去フィルタのカーネルルーチン
kernel vec4 myHazeRemovalKernel(sampler src,
// 1
__color color,
float distance,
float slope)
{
vec4

t;

float

d;

d = destCoord().y * slope

+

distance;

// 2
t = unpremultiply(sample(src, samplerCoord(src)));
// 3
t = (t - d*color) / (1.0-d);
// 4

return premultiply(t);
// 5
}

このコードが実行することを以下に示します。
1.

4 つの入力パラメータを受け取り、ベクトルを返します。フィルタのインターフェイスを宣言
するとき、必ずカーネルでの指定と同数の入力パラメータを宣言する必要があります。カー
ネルは vec4 データタイプを返す必要があります。

2.

デスティネーション座標の y 値と slope(勾配)および distance(距離)入力パラメータに
基づいて値を計算します。(Core Image が提供する)destCoord ルーチンは、ワークスペー
ス座標で、現在計算しているピクセルの位置を返します。

3.

現在の出力ピクセルに関連付けられているサンプラー src に関連付けられている変換行列が
あればそれを適用した後で、src のピクセル値を取得します。Core Image ではプリマルチプ
ライ済みアルファ値を持った色成分を使用することを思い出してください。処理の前に、サン
プラーから受け取った色値をプリマルチプライ解除する必要があります。

4.

勾配と距離の計算と色の調整を組み込んだ、かすみ除去式を適用することで出力ベクトルを
計算します。

5.

要求に応じて、vec4 ベクトルを返します。Core Image ではプリマルチプライ済みアルファ
値を持った色成分を使用するので、カーネルは結果を返す前にプリマルチプライ操作を実行
します。

サンプラーに関する補足情報:作成するカーネルにサンプルを提供するために用意するサンプ
ラーには、色値だけではなく、フィルタ計算に必要な任意の値を含めることができます。たとえ
ば、サンプラーは数値テーブル、x および y 値がそれぞれ赤と緑の成分で表されるベクトル
フィールド、高さフィールドなどから値を提供することができます。つまり、サンプラーに最大
4 つの成分を持つベクトル値フィールドを格納することができます。フィルタクライアント側で
の混乱を避けるために、ベクトルをカラーに使用しない場合を記載した文書を提供するのが最善
です。カラーを提供しないサンプラーを使用する場合は、色空間として nil を渡すことで、Core
Image が通常実行する色補正をバイパスすることができます。

Quartz Composer を使って カーネルルーチンをテストする
Quartz Composer は Mac OS X v10.4 に付属する使いやすい開発ツールです。このツールを使用
して、カーネルルーチンをテストできます。Quartz Composer アプリケーションは下記のディレク
トリにあります。
/Developer/Applications/Graphics Tools/

『Quartz Composer Programming Guide』は Quartz Composer ユーザインターフェイスについ
て説明し、コンポジションの作成方法を詳述します。Quartz Composer を使ってカーネルルーチン
をテストする前に、この文書を読むことをお勧めします。
Quartz Composer は、カーネルルーチンを配置できる Core Image Kernel パッチを提供していま
す。図 3-2 に示すように、単に Core Image Kernel パッチを対象に Inspector を開き、テキスト
フィールドにコードをペーストするか入力するだけです。

図 3-2:「Settings」パネルにペーストされたかすみ除去カーネルルーチン

コードを入力すると、図 3-3 に示すように、カーネル関数のプロトタイプに従って、パッチ入力
ポートが自動的に作成されます。パッチには、カーネルが生成する結果の画像を表す 1 つの出力
ポートが必ずあります。
この図に示す単純なコンポジションは、Image Importer パッチを使って画像ファイルをインポート
して、カーネルで処理し、Billboard パッチを使用して画面上で結果をレンダリングします(Image
Importer、Billboard の各パッチについては、『Quartz Composer Programming Guide』を参照
してください)。カーネルは複数の画像を使用することも可能です。また、出力を生成する場合は入
力画像を必要としないこともあります。
カーネルのテストのために構築するコンポジションは、図 3-3 に示すものより複雑になる可能性が
あります。たとえば、カーネルルーチンを他の組み込みの Core Image フィルタや他のカーネルルー
チンと連結することも考えられます。Quartz Composer は、カーネルルーチンのテストの過程で使
用できるパッチをほかにも非常に多く提供します。

図 3-3:カーネルルーチンをテストする Quartz Composer コンポジション

フィルタのインターフェイスを宣言する
フィルタの .h ファイルには、リスト 3-2 に示すように、フィルタ入力を指定するインターフェイス
が含まれています。かすみ除去カーネルには、4 つのパラメータ(ソース、色、距離、および勾配)
があります。フィルタのインターフェイスにも、これらの入力パラメータが含まれている必要があり
ます。入力パラメータはフィルタでの指定したのと同じ順番でなければなりません。また、データタ
イプも両者間で互換性がなければなりません。

リスト 3-2:かすみ除去フィルタのインターフェイスを宣言するコード
@interface MyHazeFilter:CIFilter
{
CIImage

*inputImage;

CIColor

*inputColor;

NSNumber

*inputDistance;

NSNumber

*inputSlope;

}

@end

カーネルオブジェクトの init メソッドを記述する
フィルタの実装ファイルには、.cikernel ファイルに指定されているカーネルルーチンを使用して
Core Image カーネルオブジェクト(CIKernel)を初期化するメソッドが含まれていま
す。.cikernel ファイルは、複数のカーネルルーチンを含むことができます。コードで番号を付け
た各行については、リストの後に詳しく説明します。

リスト 3-3:カーネルを初期化する init メソッド
static CIKernel *hazeRemovalKernel = nil;

- (id)init
{
if(hazeRemovalKernel == nil)
// 1
{
NSBundle

*bundle = [NSBundle bundleForClass:[self class]];

NSString

*code = [NSString stringWithContentsOfFile:[bundle

// 2
// 3
pathForResource:@"MyHazeRemoval"
ofType:@"cikernel"]];
NSArray

*kernels = [CIKernel kernelsWithString:code];

// 4

hazeRemovalKernel = [[kernels objectAtIndex:0] retain];
// 5
}

return [super init];
}

このコードが実行することを以下に示します。
1.

カーネルがすでに初期化されているかどうかを確認します。

2.

CIFilter クラスを動的にロードするバンドルを返します。

3.

指定のパスのファイル名から作成した文字列、この場合は MyHazeRemoval.cikernel ファイ
ルを返します。

4.

code 引数で指定した文字列から Core Image カーネルを作成します。.cikernel ファイルの

中でカーネルとしてマークされた各ルーチンが Core Image カーネルに変換されます。その
後、すべてのカーネルが kernels 配列に返されます。この例では、.cikernel ファイルに
カーネルが 1 つしかないので、配列には項目が 1 つだけ含まれます。

5.

kernels 配列の最初のカーネルとして hazeRemovalKernel を設定します。.cikernel ファ

イルに複数のカーネルが含まれる場合は、このルーチンでそれらのカーネルも初期化する必
要があります。

フィルタとその属性を登録する
バンドルをロードし、カーネルルーチンを初期化したら、フィルタを登録して次の設定を行って初期
化する必要があります。

フィルタ名

フィルタ表示名

フィルタカテゴリ

入力および出力パラメータ

各パラメータの属性クラス(必須)

各パラメータの最小値、最大値、およびデフォルト値(任意)

スライダー最小値および最大値など、必要に応じた他の情報(任意)

属性の網羅的なリストについては、『Core Image Reference』を参照してください。リスト 3-4
に、かすみ除去フィルタの初期化メソッドを示します。初期化メソッドは
registerFilterName:constructor:classAttributes: を呼び出します。フィルタ名は、かすみ

除去フィルタを使用したいときに、それを作成するために使用する文字列です。指定したコンストラ
クタオブジェクトは filterWithName: メソッドを実装します。フィルタクラス属性は
NSDictionary として指定します。このフィルタの表示名(ユーザインターフェイスに表示する名
前)は Haze Remover です。kCIAttributeFilterCateories キーとともに、フィルタが属する
フィルタカテゴリの配列を渡す必要があります。inputDistance、inputSlope の各入力パラメータ
には、最小値、最大値、スライダ最小値、スライダ最大値、デフォルト値、および ID 値のセットが
あります。スライダ最小値および最大値は、図 3-1 に示すスライダの用意に使用します。
inputColor パラメータにはデフォルト値のセットがあります。

フィルタのクライアントは attributes メソッドを呼び出すと、定義されたフィルタ属性を得ます。
注:フィルタは、クラス以外の属性に関する情報を提供する必要はありませんが、属性が存在し
ない場合に適切に動作しなければなりません。

リスト 3-4:かすみ除去フィルタを初期化するメソッド
+ (void)initialize
{
[CIFilter registerFilterName:@"MyHazeRemover"
constructor:self
classAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
@"Haze Remover", kCIAttributeFilterDisplayName,
[NSArray arrayWithObjects:
kCICategoryColorAdjustment, kCICategoryVideo,
kCICategoryStillImage,kCICategoryInterlaced,
kCICategoryNonSquarePixels,nil], kCIAttributeFilterCategories,

[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithDouble:0.0], kCIAttributeMin,
[NSNumber numberWithDouble:1.0], kCIAttributeMax,
[NSNumber numberWithDouble:0.0], kCIAttributeSliderMin,
[NSNumber numberWithDouble:0.7], kCIAttributeSliderMax,
[NSNumber numberWithDouble:0.2], kCIAttributeDefault,
[NSNumber numberWithDouble:0.0], kCIAttributeIdentity,
kCIAttributeTypeScalar, kCIAttributeType,
nil], @"inputDistance",

[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithDouble:-0.01], kCIAttributeSliderMin,
[NSNumber numberWithDouble:0.01], kCIAttributeSliderMax,
[NSNumber numberWithDouble:0.00], kCIAttributeDefault,
[NSNumber numberWithDouble:0.00], kCIAttributeIdentity,
kCIAttributeTypeScalar, kCIAttributeType,
nil], @"inputSlope",

[NSDictionary dictionaryWithObjectsAndKeys:
[CIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0],
kCIAttributeDefault, nil],

@"inputColor",

nil]];
}

画像出力メソッドを記述する
outputImage メソッドは入力画像(または画像マスク)ごとに CISampler オブジェクトを作成し、

(該当する場合は)CIFilterShape オブジェクトを作成して、カーネルメソッドを適用します。リス
ト 3-5 に、かすみ除去フィルタの outputImage メソッドを示します。このフィルタは入力画像を 1
つしか使用しないので、コードはサンプラーを 1 つだけ用意します。

リスト 3-5:かすみ除去フィルタから画像出力を返すメソッド
- (CIImage *)outputImage
{
CISampler *src = [CISampler samplerWithImage:inputImage];

return [self apply:hazeRemovalKernel, src, inputColor, inputDistance,
inputSlope, kCIApplyOptionDefinition, [src definition], nil];
}

リスト 3-5 は簡単な例です。outputImage メソッドの実装は、実際のフィルタに合わせる必要が
あります。対象フィルタがループ不変計算を必要とする場合、カーネルではなく、outputImage メ
ソッドにそれらの計算を含めます。

フィルタのインスタンスを作成するメソッドを記述する
filterWithName: メソッドは、リスト 3-6 に示すように、要求があるとフィルタのインスタンスを

作成します。

リスト 3-6:フィルタのインスタンスを作成するメソッド
+ (CIFilter *)filterWithName:(NSString *)name
{
CIFilter

*filter;

filter = [[self alloc] init];
return [filter autorelease];
}

上記の手順に従ってフィルタを作成すると、アプリケーションの中でフィルタを使用できるようにな
ります。詳細については、「カスタムフィルタの使用」を参照してください。1 つのフィルタまたは
フィルタのセットを他のアプリケーションのプラグインとして利用できるようにしたい場合は、「カ
スタムフィルタをイメージユニットとしてパッケージ化する」を参照してください。

カスタムフィルタの使用
カスタムフィルタを使用する手順は、フィルタクラスを初期化する必要があることを除けば、Core
Image が提供するフィルタを使用する手順と同じです。最後のセクションで作成したかすみ除去
フィルタは次のコード行を使用して初期化します。
[MyHazeFilter class];

リスト 3-7 に、かすみ除去フィルタの使用方法を示します。このコードと 「画像の処理」で説明し
たコードの類似点に注目してください。
注:フィルタをイメージユニットとしてパッケージ化した場合は、そのフィルタをロードする必要が
あります。詳細については、「イメージユニットの使用」を参照してください。

リスト 3-7:カスタムフィルタの使用
- (void)drawRect:(NSRect)rect
{
CGRect

cg = CGRectMake(NSMinX(rect), NSMinY(rect),
NSWidth(rect), NSHeight(rect));

CIContext *context = [[NSGraphicsContext currentContext] CIContext];

if(filter == nil)
{
NSURL

*url;

[MyHazeFilter class];

url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:@"CraterLake"

ofType:@"jpg"]];

filter

= [CIFilter filterWithName:@"MyHazeRemover"
keysAndValues:@"inputImage",
[CIImage imageWithContentsOfURL:url],
@"inputColor",
[CIColor colorWithRed:0.7 green:0.9 blue:1],
nil];

[filter retain];
}

[filter setValue:[NSNumber numberWithFloat:distance]
forKey:@"inputDistance"];
[filter setValue:[NSNumber numberWithFloat:slope]
forKey:@"inputSlope"];

[context drawImage:[filter valueForKey:@"outputImage"]
atPoint:cg.origin

fromRect:cg];

}

ROI 関数の提供
関心領域(ROI:Region Of Interest)では、サンプラーが処理のためにカーネルに渡すピクセル情
報を取り出す対象となるソースの領域を定義します。「Core Image の概念」の「関心領域」に関す
る議論から、ROI のワークスペース座標と定義領域は完全に一致するか、互いに依存するか、または
関係がないことを思い出してください。Core Image は常に、ROI と定義領域が一致するものと仮定
します。作成したフィルタにこの仮定が当てはまる場合、ROI 関数を用意する必要はありません。し
かし、作成したフィルタに仮定が当てはまらない場合は、ROI 関数を用意する必要があります。さら
に、ROI 関数は、CPU 実行可能フィルタに対してのみ提供できます。

注:CPU 非実行可能フィルタの ROI と定義領域は一致する必要があります。CPU 非実行可能
フィルタには ROI 関数は提供できません。「非実行可能フィルタの作成」を参照してください。
提供する ROI 関数は、カーネルが使用する各サンプラーの関心領域を計算する必要があります。提
供した ROI 関数は、Core Image によって呼び出され、サンプラーインデックス、レンダリング対
象領域の範囲、およびルーチンが必要とする任意のデータを渡されます。メソッドのシグネチャは、
次の形式でなければなりません。
- (CGRect) regionOf:(int)samplerIndex
destRect:(CGRect)r
userInfo:obj;

ここで

samplerIndex には、メソッドが ROI を計算する対象となるサンプラーを指定します。

r には、領域の範囲を指定します。

obj には、ルーチンが必要とする任意のデータを指定します。obj パラメータを使用すること

で、ROI 関数が必要なデータを受け取り、そのデータが正しいこと(フィルタのインスタンス
変数が変わっている可能性があるので)を保証できます。
Core Image は、フィルタを通るたびに、ルーチンを呼び出します。メソッドは、渡された矩形と
ユーザ情報に基づいて ROI を計算し、CGRect データタイプとして指定された ROI を返します。
ROI 関数を登録するには、CIKernel のメソッド setROISelector: を呼び出し、ROI 関数を
aMethod 引数として渡します。たとえば、次のように記述します。

[kernel setROISelector:@selector(regionOf:destRect:userInfo:)]
次のセクションでは、ROI 関数の例を示します。

このセクションの内容:
簡単な ROI 関数
ガラス歪みフィルタの ROI 関数
環境マップの ROI 関数
サンプラー順序の指定

簡単な ROI 関数
ROI 関数が userInfo 引数にデータを渡される必要がない場合は、リスト 3-8 に示すように、その
引数を含める必要はありません。リストのコードは、サンプラーを 1 ピクセルずらします。これは
エッジ検出フィルタまたは 3×3 畳み込みで使用する計算です。

リスト 3-8:簡単な ROI 関数
- (CGRect)regionOf:(int)samplerIndex destRect:(CGRect)r
{
return CGRectInset(r, -1.0, -1.0);
}

この関数は samplerIndex 値を無視します。カーネルが使用するサンプラーが 1 つだけの場合、イ
ンデックスは無視できます。カーネルが使用するサンプラーが複数の場合は、指定されたサンプ
ラーに適した ROI を返すようにする必要があります。以降のセクションでは、その方法について説
明します。

ガラス歪みフィルタの ROI 関数
リスト 3-9 に、ガラス歪みフィルタの ROI 関数を示します。この関数は 2 つのサンプラーの ROI
を返します。サンプラー 0 は変形対象の画像を示し、サンプラー 1 はガラスに使用するテクスチャ
を示します。
この関数は、userInfo パラメータを使用して、サンプラー 0 が必要とする入力スケールを渡しま
す。歪みは、すべての方向に、渡されたスケールの半分の量だけずらされることに注目してくださ
い。
フィルタはテクスチャを矩形パターンとして使用するので、ガラステクスチャのすべて(サンプラー
1)を参照する必要があります。結果として、この関数は無限の矩形を ROI として返します。無限の

矩形は、サンプラーのすべてを使用するように指定する記法です(定数 CGRectInfinite は
Quartz 2D API に定義されています)。

注:無限の ROI を使用する場合は、サンプラーの定義領域が無限にならないようにします。そう
しないと、Core Image は画像をレンダリングできません。

リスト 3-9:ガラス歪みフィルタの ROI 関数
- (CGRect)regionOf:(int)samplerIndex destRect:(CGRect)r userInfo:obj
{
float

s;

s = [obj floatValue] * 0.5f;
if (samplerIndex == 0)
return CGRectInset(r, -s,-s);

return CGRectInfinite;
}

環境マップの ROI 関数
リスト 3-10 に、1 つが環境マップである 3 つのサンプラーを使用するカーネルの ROI を返す ROI
関数を示します。サンプラー 0 およびサンプラー 1 の ROI は定義領域と一致します。そのため、こ
のコードは、サンプラー 2 以外のサンプラーについては、渡された destination 矩形を返します。
サンプラー 2 は、環境マップの高さと幅を指定する userInfo パラメータに渡される値を使用し
て、関心領域を指定する矩形を作成します。

リスト 3-10:関心領域を計算するルーチンの提供
- (CGRect)regionOf:(int)samplerIndex
forRect:(CGRect)destination
userInfo:(NSArray *)myArray
{
if (samplerIndex == 2)
return CGRectMake (0, 0,
[[myArray objectAtIndex:0] floatValue],
[[myArray objectAtIndex:1] floatValue]);
return destination;
}

サンプラー順序の指定
前の例で見たように、サンプラーにはインデックスが関連付けられています。ROI 関数を提供する
と、Core Image によってサンプラーのインデックスが渡されます。サンプラーインデックスは、
フィルタの apply メソッドに渡されるときには、その順序に基づいて割り当てられます。リスト
3-11 に示すように、フィルタの outputImage ルーチン内から apply を呼び出します。
このリストでは、特にサンプラーを用意し、カーネルに提供する方法を示す、番号の付いているコー
ド行に注目してください。これらの各行については、リストの後に詳しく説明します。

リスト 3-11:環境マップを使用するフィルタの画像出力ルーチン
- (CIImage *)outputImage
{
int i;
CISampler *src, *blur, *env;
CIVector *envscale;

// 1

CGSize size;
CIKernel *kernel;

src = [CISampler samplerWithImage:inputImage];
blur = [CISampler samplerWithImage:inputHeightImage];
env = [CISampler samplerWithImage:inputEnvironmentMap];
size = [env extent].size;

// 2
// 3
// 4

envscale = [CIVector vectorWithX:[inputEMapWidth floatValue]
Y:[inputEMapHeight floatValue]];
i = [inputKind intValue];
if ([inputHeightInAlpha boolValue])
i += 8;
kernel = [roundLayerKernels objectAtIndex:i];
[kernel setROISelector:@selector(regionOf:forRect:userInfo:)];
NSArray *array

= [NSArray arrayWithObjects:inputEMapWidth,
inputEMapHeight, nil];

// 5

return [self apply:kernel,src, blur, env,
// 6
[NSNumber numberWithFloat:pow(10.0, [inputSurfaceScale
floatValue])],
envscale,
inputEMapOpacity,
kCIApplyOptionDefinition,
[src definition],
kCIApplyOptionUserInfo,
array,
nil];
}

1

カーネルに必要な 3 つのサンプラーのそれぞれに対する変数を宣言します。

2 入力画像のサンプラーを用意します。このサンプラーの ROI は定義領域と一致します。
3 入力の高さに使用する画像のサンプラーを用意します。このサンプラーの ROI は定義領域と
一致します。
4 環境マップのサンプラーを用意します。このサンプラーの ROI は定義領域と一致しません。
つまり、ROI 関数を提供する必要があります。
5 ROI 関数を、関数を必要としているカーネルに登録します。
6 引数をカーネルに適用して、Core Image 画像(CIImage)を生成します。渡す引数は、
カーネル関数の関数シグネチャと互換性のあるタイプでなければなりません(ここには示し
ませんが、互換性のあるタイプであるとします)。引数のリストは、必要に応じて nil で終
了します。

サンプラー引数の順序によって、そのインデックスが決まります。カーネルに渡される最初のサンプ
ラーはインデックス 0 となります。この場合、src サンプラーがそれに当たります。カーネルに渡
される 2 番目のサンプラー(blur)にはインデックス 1 が割り当てられます。3 番目のサンプラー
(env)にはインデックス 2 が割り当てられます。各サンプラーに適切な ROI を提供できるよう
に、ROI 関数を確認することが重要です。

非実行可能フィルタの作成
CPU 非実行可能フィルタは安全であることが保証されています。このタイプのフィルタは GPU 上で
のみ動作するので、ウイルスやトロイの木馬として活動したり、その他の悪質な動作に関与したりで
きません。セキュリティを保証するために、CPU 非実行可能フィルタには次の制限があります。

このタイプのフィルタは純粋なカーネルです。つまり、.cikernel ファイルに全体が含まれ
ています。そのため、フィルタクラスがなく、提供できる処理のタイプに制限があります。非
実行可能フィルタに対して有効なサンプリング命令のタイプは、次の形式のサンプリング命令
のみです。color = sample (someSrc, samplerCoord(someSrc));

CPU 非実行可能フィルタは、イメージユニットの一部としてパッケージ化する必要がありま
す。

Core Image は、ROI が定義領域と一致するものと仮定します。つまり、非実行可能フィルタ
は、ブラーや歪みのようなエフェクトには適していません。

カスタムフィルタをイメージユニットとしてパッケージ化する
カスタムフィルタは、他のユーザが使用できるように、イメージユニットとしてパッケージ化できま
す。イメージユニットには、実行可能フィルタまたは非実行可能フィルタを含めることができます
(詳細については、「実行可能フィルタおよび非実行可能フィルタ」を参照してください)。
次の手順に従って、カスタムフィルタからイメージユニットを作成します。
1.

「Xcode でイメージユニットプロジェクトを作成する」

2.

イメージユニットテンプレートが提供するプレースホルダファイルに変更を加えてフィルタを
作成する(フィルタの作成については、「カスタムフィルタの作成」を参照)。

3.

「load メソッドをカスタマイズする」

4.

「記述プロパティリストを変更する」

5.

プロジェクトをビルドする。

Xcode でイメージユニットプロジェクトを作成する
Xcode には、イメージユニットを作成するためのテンプレートが用意されています。イメージユニッ
トプロジェクトを作成すると、作業の開始に必要なファイルがすべて用意され、プロジェクトは適切
なフレームワークにリンクされます。
次の手順に従って、Xcode でイメージユニットプロジェクトを作成します。
1.

Xcode を起動し、「File」(ファイル)−「New Project」(新規プロジェクト)を選択しま
す。

2.

図 3-4 に示すように、「New Project」(新規プロジェクト)ウインドウで、「Standard
Apple Plug-ins」の下にある「Image Unit Plug-in for Objective C」を選びます。次に、
「Next」(次へ)をクリックします。

図 3-4: 「New Project」(新規プロジェクト)ウインドウのイメージユニットテンプレート

3.

イメージユニットプロジェクトに名前を付け、「Finish」(完了)をクリックします。図 3-5
に示すようなプロジェクトウインドウが開きます。

図 3-5:新しいイメージユニットプロジェクトのプロジェクトウインドウ

load メソッドをカスタマイズする
Xcode は、イメージユニットテンプレートの一部として実装ファイルを含んでいます。その実装ファ
イルの中に、リスト 3-12 に示す load メソッドがあります。このメソッドには、登録チェックな
ど、必要な初期化処理を実行する任意のコードを追加できます。このメソッドは、フィルタが正常に
ロードされれば true を返します。

図 3-12:イメージユニットテンプレートが提供する load メソッド
-(BOOL)load:(void*)host
{
// custom image unit initialization code goes here(カスタムのイメージユニット初
期化コードをここに記入)
return YES;
}

フィルタのクリーンアップタスクが必要であれば、それを実行する unload メソッドを書くことがで
きます。

記述プロパティリストを変更する
実行可能フィルタの場合、Description.plist ファイルからは、バージョン番号、フィルタクラ
ス、およびフィルタ名のみが読み取られます。フィルタの属性のリストは、コードの中で提供しま
す。イメージユニットテンプレートに用意されている Description.plist ファイルをチェックし
て、フィルタ名が正しいことを確認し、バージョン番号を入力します。
CPU 非実行可能フィルタの場合は、イメージユニットホストが Description.plist ファイルを読
み取り、表 3-1 に示すフィルタ属性に関する情報を取得します。Description.plist ファイルに
変更を加えて、適切な情報を含むようにする必要があります(フィルタキーについては、『Core
Image Reference』も参照してください)。

表 3-1:フィルタ記述プロパティリストのキー
キー

関連付けられる値

CIPlugInFilterList

フィルタディクショナリのディクショナリ。このキーがある場合は、イメージユニッ
トに少なくとも 1 つの CIFilter があることを示します。

CIFilterDisplayName

Description.strings ファイルにあるローカライズされたフィルタ名。

CIFilterClass

取得可能であれば、フィルタ実装を含んでいるバイナリ内のクラス名。

CIKernelFile

取得可能であれば、バンドル内のフィルタカーネルのファイル名。このキーは非実行
可能フィルタの定義に使用します。

CIFilterAttributes

フィルタを記述する属性のディクショナリ。これは、フィルタの記述時に用意した属
性ディクショナリと同じです。

CIInputs

入力キーとそれらに関連付けられている属性の配列。入力キーは、カーネル関数のパ
ラメータと同じ順番でなければなりません。各属性はそのパラメータクラス(表 3-2
を参照)と名前を含んでいる必要があります。

CIOutputs

将来の使用のために予約されています。

CIHasCustomInterface

なし。このキーは、フィルタにカスタムのユーザインターフェイスがあることを指定
するのに使用します。ホストが、ユーザインターフェイスのビューを提供します。

CIPlugInVersion

CIPlugIn アーキテクチャのバージョン。すなわち、1.0 です。

表 3-2 に、入力パラメータクラスと各クラスに関連付けられる値の一覧を示します。非実行可能
フィルタの場合は、各入力パラメータおよび出力パラメータに対してパラメータクラスを提供しま
す。

表 3-2:入力パラメータクラスと想定されている値
入力パラメータクラス

関連付けられる値

CIColor

色を指定する文字列。deviceRGBColorFromString を参照。

CIVector

ベクトルを指定する文字列。vectorWithString を参照。

CIImage

バンドルに対する画像の相対パスまたは画像の絶対パスを記述する NSString。

すべてのスカラータイプ

NSNumber。

図 3-6 に、カラージェネレータフィルタの description.plist ファイルの内容を示します。
Property List Editor を使用して、description.plist ファイルに変更を加えることができます。
Property List Editor アプリケーションは Developer/Applications/Utilities/ にあります。

図 3-6:サンプルフィルタの記述プロパティリスト

イメージユニットの使用
イメージユニットは、使用の前にロードする必要があります。アプリケーションは表 3-3 に示す
CIPlugin メソッドのいずれかを呼び出すことで、イメージユニットをロードします。CIPlugin メ
ソッドがイメージユニットをロードしたら、Core Image フィルタを使用する場合と同じように進め
ます。「Core Image フィルタの使用」を参照してください。
注:イメージユニットをホスティングするクライアントは、未知のデータタイプまたはクラスを持っ
たフィルタのユーザインターフェイス要素を表示しないでください。そうすることで、イメージユ
ニットホストアプリケーションは、将来、新しいデータタイプとクラスが API に追加されても正し
く機能します。

表 3-3:イメージユニットのロードに使用するメソッド
メソッド

説明

loadAllPlugIns

.plugin 拡張子の付いたファイルがないかイメージユニットディレクトリ(/
Library/Graphics/Image Units と ~/Library/Graphics/Image
Units)を調べ、イメージユニットをロードします。

loadNonExecutablePlugIns

.plugin 拡張子の付いたファイルがないかイメージユニットディレクトリ(/
Library/Graphics/Image Units と ~/Library/Graphics/Image
Units)を調べ、イメージユニットのカーネルのみをロードします。つま
り、.cikernel 拡張子の付いたファイルのみをロードします。この呼び出し
はイメージユニットコードを実行しません。

loadPlugIn:allowNonExecut
able:

url 引数に指定した場所にあるイメージユニットをロードします。イメージユ
ニットコードを実行せずにイメージユニットのカーネルのみをロードするに
は、allowNonExecutable 引数に true を渡します。

Core Image フィルタ
この章は、Mac OS X v10.4 で利用できる大部分のフィルタの目録となっています。目録には、読者
が使用することのできるさまざまな組み込みフィルタが含まれていますが、技術仕様書となることを
目的とはしていません。システム内の利用できるフィルタの数や、デフォルト値、最小値、最大値
が、この章で示したものと一致しない可能性があります。Core Image フィルタに関する最新情報を
入手するには、「Core Image フィルタの使用」で説明したように、プログラムの中からシステムに
照会します。
フィルタを、以下に示すセクションに分類してあります。

「ブレンドモードフィルタ (Blend Mode Filters)」

「色調節フィルタ (Color Adjustment Filters)」

「カラーエフェクトフィルタ (Color Effect Filters)」

「合成フィルタ (Compositing Filters)」

「歪みエフェクトフィルタ (Distortion Effect Filters)」

「フォーカスフィルタ (Focus Filters)」

「ジェネレータフィルタ (Generator Filters)」

「幾何学調節フィルタ (Geometry Adjustment Filters)」

「グラデーションフィルタ (Gradient Filters)」

「ハーフトーンエフェクトフィルタ (Halftone Effects Filters)」

「スタイルフィルタ (Stylize Filters)」

「タイルエフェクトフィルタ (Tile Effect Filters)」

「トランジションフィルタ (Transition Filters)」

この章では、掲載した各フィルタについて、フィルタの説明、当該フィルタが属する Core Image カ
テゴリの一覧、入力パラメータの説明、フィルタを適用した結果の画像を提示します。

ブレンドモードフィルタ (Blend Mode Filters)
ブレンドモードフィルタは、ある画像を別の画像に重ねてペイントする方法を指定する合成フィルタ
の一種です。Core Image ブレンドモードフィルタは、『PDF Reference』 (Fourth Edition、
Version 1.5)で定義されているブレンドモードに基づいています。「合成フィルタ」も参照してく
ださい。
図 4-1 に、このセクションで示す合成例の入力として使用する 2 つの画像を示します。左の画像は
必ず前景画像として使用し、inputImage パラメータに渡します。右の画像は必ず背景画像として使
用し、inputBackgroundImage パラメータに渡します。

図 4-1:前景画像(左)と背景画像(右)

このセクションの内容:
マスクを使用したブレンド
色ブレンドモード
色のバーンブレンドモード
色のドッジブレンドモード
不明瞭化ブレンドモード
差違ブレンドモード
除外ブレンドモード
ハードライトブレンドモード

色相ブレンドモード
明瞭化ブレンドモード
明度ブレンドモード
乗算ブレンドモード
オーバーレイブレンドモード
彩度ブレンドモード
スクリーンブレンドモード
ソフトライトブレンドモード

マスクを使用したブレンド
CIBlendWithMask フィルタは、グレースケールマスクの値を使用して、画像と背景の間を補間しま
す。マスク値が 0.0 の場合、結果として背景が使用されます。マスク値が 1.0 の場合、結果として
画像が使用されます。図 4-3 は、図 4-2 に示すマスクと図 4-1 に示す画像を使用して作成しまし
た。

図 4-2:グレースケールマスク

図 4-3:CIBlendWithMask フィルタを適用した後の結果画像

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputBackground

背景として使用する CIImage オブジェクト。
inputMaskImage

補間に使用するグレースケール画像(CIImage オブジェクト)。

色ブレンドモード
CIColorBlendMode フィルタは、背景画像の輝度値および前景画像の色相と彩度値を使用します。
このモードでは、画像のグレーレベルが維持されます。このモードは、モノクロ画像の色付けまた
はカラー画像の淡色化に使用できます。下の画像と図 4-1 に示した 2 つの画像を比較してくださ
い。

図 4-4:CIColorBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

色のバーンブレンドモード
CIColorBurnBlendMode フィルタは、背景画像サンプルを暗くして、前景画像サンプルを反映しま
す。白を指定する前景画像サンプル値は変化を起こしません。下の画像と図 4-1 に示した 2 つの画
像を比較してください。

図 4-5:CIColorBurnBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

色のドッジブレンドモード
CIColorDodgeBlendMode フィルタは、背景画像サンプルを明るくして、前景画像サンプルを反映
します。黒を指定する前景画像サンプル値は変化を起こしません。下の画像と図 4-1 に示した 2 つ
の画像を比較してください。

図 4-6:CIColorDodgeBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

不明瞭化ブレンドモード
CIDarkenBlendMode フィルタは、(ソース画像また背景から)暗いほうのサンプルを選択して合成
画像サンプルを作成します。その結果、背景画像サンプルは、それらよりも暗いソース画像サンプル
があれば、それらで置き換えられます。それ以外の場合、背景画像サンプルは変更されません。下の
画像と図 4-1 に示した 2 つの画像を比較してください。

図 4-7: CIDarkenBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

差違ブレンドモード
CIDifferenceBlendMode フィルタは、背景と前景のどちらのサンプルの明度値が大きいかに応じ
て、背景画像サンプルカラーから前景画像サンプルカラーを減算するか、前景画像サンプルカラーか
ら背景画像サンプルカラーを減算します。前景画像サンプル値が黒の場合は変化はありませんが、白
の場合は背景カラー値が反転します。下の画像と図 4-1 に示した 2 つの画像を比較してください。

図 4-8:CIDifferenceBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

除外ブレンドモード
CIExclusionBlendMode フィルタは CIDifferenceBlendMode と同じようなエフェクトをもたらし
ますが、コントラストが低くなります。前景画像サンプル値が黒の場合は変化はありませんが、白の
場合は背景カラー値が反転します。下の画像と図 4-1 に示した 2 つの画像を比較してください。

図 4-9:CIExclusionBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

ハードライトブレンドモード
CIHardLightBlendMode フィルタは、前景画像サンプルカラーに応じて、カラーを乗算するかスク
リーニングします。前景画像サンプルカラーが 50% のグレーより明るい場合、スクリーニングのよ
うに明るくするエフェクトとなります。前景画像サンプルカラーが 50% のグレーより暗い場合、乗
算のように暗くするエフェクトとなります。前景画像サンプルカラーが 50% のグレーと等しい場
合、変化はありません。画像サンプルが純粋な黒または純粋な白の場合は、純粋な黒または白にな
ります。エフェクトは全体として、ソース画像に強いスポットライトを当てたような結果となりま
す。これは、シーンへのハイライトの追加に使用します。下の画像と図 4-1 に示した 2 つの画像を
比較してください。

図 4-10:CIHardLightBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

色相ブレンドモード
CIHueBlendMode フィルタは、背景画像の輝度値と彩度値および前景画像の色相を使用します。下
の画像と図 4-1 に示した 2 つの画像を比較してください。

図 4-11:CIHueBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

明瞭化ブレンドモード
CILightenBlendMode フィルタは、(前景画像または背景から)明るいほうのサンプルを選択して
合成画像サンプルを作成します。その結果、背景画像サンプルは、それらよりも明るいソース画像サ
ンプルがあれば、それらで置き換えられます。それ以外の場合、背景画像サンプルは変更されませ
ん。下の画像と図 4-1 に示した 2 つの画像を比較してください。

図 4-12:CILightenBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

明度ブレンドモード
CILuminosityBlendMode フィルタは、背景画像の色相と彩度および前景画像の輝度を使用します。
このモードでは、CIColorBlendMode によって生じるエフェクトと逆のエフェクトが生じます。下
の画像と図 4-1 に示した 2 つの画像を比較してください。

図 4-13:CILuminosityBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

乗算ブレンドモード
CIMultiplyBlendMode フィルタは、前景画像サンプルと背景画像サンプルを乗算して、色が 2 つの
サンプルカラーのどちらかと少なくとも同じ暗さの画像を生成します。下の画像と図 4-1 に示した
2 つの画像を比較してください。

図 4-14:CIMultiplyBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

オーバーレイブレンドモード
CIOverlayBlendMode フィルタは、背景カラーに応じて、前景画像サンプルと背景画像サンプルを
乗算するかスクリーニングします。その結果、既存の画像サンプルをオーバーレイしながら、背景の
ハイライトとシャドウを維持することになります。背景カラーは前景画像と混合され、背景の明る
さまたは暗さを反映します。下の画像と図 4-1 に示した 2 つの画像を比較してください。

図 4-15:CIOverlayBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

彩度ブレンドモード
CISaturationBlendMode フィルタは、背景画像の輝度値と色相値および前景画像の彩度を使用しま
す。背景の中で彩度のない領域(純粋なグレーの領域)では、変化は生じません。下の画像と図
4-1 に示した 2 つの画像を比較してください。

図 4-16:CISaturationBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

スクリーンブレンドモード
CIScreenBlendMode フィルタは、前景画像サンプルの反転と背景画像サンプルの反転を乗算しま
す。これは結果として、2 つの提供サンプルカラーのどちらかと少なくとも同じ明るさの色になりま
す。下の画像と図 4-1 に示した 2 つの画像を比較してください。

図 4-17:CIScreenBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

ソフトライトブレンドモード
CISoftLightBlendMode フィルタは、前景画像サンプルカラーに応じて、色を暗くするか明るくしま
す。前景画像サンプルカラーが 50% のグレーより明るい場合、ドッジのように背景を明るくするエ
フェクトとなります。前景画像サンプルカラーが 50% のグレーより暗い場合、ドッジのように背景
を暗くするエフェクトとなります。前景画像サンプルカラーが 50% のグレーと等しい場合、変化は
ありません。画像サンプルが純粋な黒または純粋な白の場合は、領域が暗くなるか明るくなります
が、純粋な黒または白にはなりません。エフェクトは全体として、前景画像に拡散したスポットラ
イトを当てたような結果となります。これは、シーンへのハイライトの追加に使用します。下の画像
と図 4-1 に示した画像を比較してください。

図 4-18:CISoftLightBlendMode フィルタを適用した後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

色調節フィルタ (Color Adjustment Filters)
色調節フィルタはカラー値を変更します。これらのフィルタは、色かぶりの排除、色相の調整、輝度
とコントラストの修正に使用します。色調節フィルタは、カラーマネジメントを実行するものではあ
りません。カラーマネジメントは ColorSync が実行します。画像に関連付けられている色空間の指
定には、Quartz 2D を使用します。詳細については、『Color Management Overview』および
『Quartz 2D Programming Guide』を参照してください。カラーで芸術的なエフェクトを実現し
たい場合は、「カラーエフェクトフィルタ」を参照してください。
このセクションの各フィルタの説明では、図 4-19 に示す「自由の女神」の画像に当該フィルタを
適用した結果を示す画像を提示します。

図 4-19:「自由の女神」の未処理画像

このセクションの内容:
カラーコントロール
カラーマップ
カラーマトリクス
露出調整
ガンマ調整
色相調整
ホワイトポイント調整

カラーコントロール
CIColorControls フィルタは色相、輝度、およびコントラストの値を調整します。このフィルタは通
常、好ましくない照明条件、またはホワイトポイントの設定が不適切なデバイスで撮影された写真
の修正に使用します。下の画像と図 4-19 に示したオリジナル画像を比較してください。

図 4-20:CIColorControls フィルタ適用後の画像

所属: kCICategoryColorAdjustment、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage
処理対象の CIImage オブジェクト。
inputSaturation
彩度の調整量を指定するスカラー値(NSNumber)。デフォルト値は 1.0 です。範囲は 0.0 ∼ 3.0 です。
inputBrightness
輝度の調整量を指定するスカラー値(NSNumber)。デフォルト値は 0.0 です。範囲は -1.0 ∼ 1.0 です。
inputContrast
コントラストの調整量を指定するスカラー値(NSNumber)。デフォルト値は 1.0 です。範囲は 0.25 ∼ 4.0
です。

カラーマップ
CIColorMap フィルタは、テーブルに用意されたマッピング値を使用して、ソースカラー値の非線形
変換を実行します。下の画像と図 4-19 に示したオリジナル画像を比較してください。

図 4-21:CIColorMap フィルタ適用後の画像

所属: kCICategoryColorAdjustment、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

変換元の CIImage オブジェクト。
inputGradientImage

アルファのある環境マップを指定する CIImage。通常、この画像にはハイライトとシャドウが含ま
れています。

カラーマトリクス
CIColorMatrix フィルタは、ソースカラー値を乗算し、各色成分にバイアス因子を加算します。下の
画像と図 4-19 に示したオリジナル画像を比較してください。

図 4-22:CIColorMatrix フィルタの適用結果

所属: kCICategoryColorAdjustment、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

前景として使用する CIImage オブジェクト。
inputAVector

色のアルファ成分を指定する CIVector オブジェクト。デフォルトベクトルは [0 0 0 1] です。
inputRVector

色の赤成分を指定する CIVector オブジェクト。デフォルトベクトルは [1 0 0 0] です。
inputGVector

色の緑成分を指定する CIVector オブジェクト。デフォルトベクトルは [0 1 0 0] です。
inputBVector

色の青成分を指定する CIVector オブジェクト。デフォルトベクトルは [0 0 1 0] です。
inputBiasVector

バイアスベクトルを指定する CIVector オブジェクト。デフォルトベクトルは [0 0 0 0] です。

露出調整
CIExposureAdjust フィルタは、カメラの F ストップ調整を模倣することで、露出設定を調整しま
す。下の画像と図 4-19 に示したオリジナル画像を比較してください。

図 4-23:CIExposureAdjust フィルタで処理した後の画像

所属: kCICategoryColorAdjustment、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputEV

画像を明るくしたり暗くしたりする F ストップの分量を指定する値(NSNumber)。推奨範囲は
-5.0 ∼ 5.0 です。

ガンマ調整
CIGammaAdjust フィルタは中間調の輝度を調整します。このフィルタは通常、ディスプレイの非線
形のエフェクトの補正に使用します。ガンマを調整するということは、黒と白の間の移り変わりの
勾配を変えることを意味します。下の画像と図 4-19 に示したオリジナル画像を比較してください。

図 4-24:CIGammaAdjust フィルタ適用後の画像

所属: kCICategoryColorAdjustment、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputPower

出力に対する入力のマッピングに使用するべき乗関数の指数(ガンマ値ともいう)を指定するスカ
ラー値(NSNumber)。デフォルト値は 0.75 です。範囲は 0.1 ∼ 3.0 です。

色相調整
CICHueAdjust フィルタは、ソースピクセルの全体的な色相、すなわち濃淡を変えます。下の画像と
図 4-19 に示したオリジナル画像を比較してください。

図 4-25:CIHueAdjust フィルタで処理した後の画像

所属: kCICategoryColorEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputAngle

HSV 色空間および HLS 色空間における色相の位置を指定する値(NSNumber)。これは 0.0 ∼ 2
pi までの範囲の角度です。値 0 は赤色を示します。緑色は pi/3 ラジアンに相当し、青色は 2/3 pi
ラジアンです。

ホワイトポイント調整
CIWhitePointAdjust フィルタは画像の基準ホワイトポイントを調整し、新しい基準を使用してソー
スのすべての色をマップします。下の画像と図 4-19 に示したオリジナル画像を比較してください。

図 4-26:CIWhitePointAdjust フィルタで処理した後の画像

所属: kCICategoryColorAdjustment、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputColor

ホワイトポイント基準として使用するカラー値を指定する CIColor オブジェクト。

カラーエフェクトフィルタ (Color Effect Filters)
カラーエフェクトフィルタは、画像の色を変えることで芸術的なエフェクトを実現します。たとえ
ば、カラー画像をモノクロ画像やセピア調画像に変えることができます。カラー値を調節する場合
は、「色調節フィルタ」を使用できます。

このセクションの内容:
カラーキューブ
色の反転
モノクロ化
ポスタライズ
偽色
セピア調

カラーキューブ
CIColorCube フィルタは 3 次元のカラーテーブルを使用して、ソース画像ピクセルを変換します。
図 4-27 に、CIColorCube フィルタで実現できるエフェクトの種類を示します。ビーチの風景のオ
リジナル画像が左端にあります。右側の 3 つの画像は、異なるカラーテーブル値をオリジナル画像
に適用した結果です。

図 4-27:オリジナル(左端)とカラーキューブフィルタを使って処理した 3 つの画像の例

所属: kCICategoryColorEffect、kCICategoryVideo、kCICategoryInterlaced、
kCICategoryNonSquarePixels、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCubeData

プリマルチプライ済みアルファを使用する浮動小数点 RGBA セルで構成され、セルが次のとおり順
序付けられているカラーキューブデータの NSData ポインタ。データの列と行はそれぞれ、赤と緑
のインデックスが付けられています。各データプレーンは、データの中で次に高い位置のプレーンが
続き、それぞれ青のインデックスが付けられます。たとえば、テーブルに 16 の行、16 の列、およ
び 16 のプレーンがある場合は、テーブルには 4096 のエレメントがあります。エレメントはそれぞ
れ 16 バイト(4 つの浮動小数点数)なので、テーブルの物理サイズは 64K です。アドレスが赤イ
ンデックス 5、緑インデックス 7、青インデックス 11 であるセルは、セルオフセット:5 + 7 *
16 + 11 * 16 * 16 = 2933 にあります。行、列、プレーン、およびセルオフセットの原点は イン
デックス = 0 にあります。テーブル内の値が範囲 [0...1] の外にある場合、CIColorCube フィルタ
の動作は未定義です。
inputCubeDimension

キュービックカラーテーブルのエッジサイズ。この値は、整数かつ 2 のべき乗でなければなりませ
ん。

色の反転
CIColorInvert フィルタは画像の色を反転し、画像をネガフィルムのように見せますが、カラーネガ
フィルムのようなオレンジがかった色ではありません。色の反転フィルタは単にカラーを反転するだ
けなので、カラーネガフィルムを模倣するものではありません。下の画像と図 4-19 に示したオリ
ジナル画像を比較してください。

図 4-28:CIColorInvert フィルタで処理した後の画像

所属: kCICategoryColorEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。

モノクロ化
CIColorMonochrome フィルタは、カラーが単色の濃淡の範囲に収まるように、カラーをマップし
直します。単色を指定する必要があります。セピア調の画像を作成する場合は、「セピア調」フィル
タも使用できます。下の画像と図 4-19 に示したオリジナル画像を比較してください。

図 4-29:CIColorMonochrome フィルタで処理した後の画像

所属: kCICategoryColorEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputColor

使用する単色を指定する CIColor オブジェクト。

inputIntensity

フィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値(NSNumber)。範囲は 0.0
∼ 1.0 です。値 1.0 はすべての色を、指定した単色の濃淡にマップします。

ポスタライズ
CIColorPosterize フィルタは、赤、緑、および青の色成分を、各色成分に指定した輝度値の数値に
マップし直します。このフィルタは、色を平坦化して、シルクスクリーンポスターのような見た目に
します。下の画像と図 4-19 に示したオリジナル画像を比較してください。

図 4-30:CIColorPosterize フィルタで処理した後の画像

所属: kCICategoryColorEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputLevels

色成分ごとのカラーレベルの数値を指定するスカラー値(NSNumber)。デフォルト値は 6.0 で
す。範囲は 0.0 ∼ 30.0 です。

偽色
CIFalseColor フィルタは、輝度を 2 色のカラーマップにマップします。偽色は多くの場合、紫外線
画像や X 線画像といった、天文学などの科学データの処理に使用します。下の画像と図 4-19 に示
したオリジナル画像を比較してください。

図 4-31:CIFalseColor フィルタで処理した後の画像

所属: kCICategoryColorEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputColor0

最初の色を指定する CIColor オブジェクト。
inputColor1

2 番目の色を指定する CIColor オブジェクト。

セピア調
CISepiaTone フィルタは、画像の色を茶色のさまざまな濃淡にマップします。セピア以外の色調を
使用するモノクロ画像を作成する場合は、「モノクロ化」を参照してください。下の画像と図 4-19
に示したオリジナル画像を比較してください。

図 4-32:CISepiaTone フィルタで処理した後の画像

所属: kCICategoryColorEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputIntensity

フィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値(NSNumber)。デフォル
ト値は 1.0 です。範囲は 0.0(エフェクトなし)∼ 1.0(最大エフェクト)です。

合成フィルタ (Compositing Filters)
合成フィルタは、2 つの画像ソースを操作の対象とし、一方の画像のカラー値を使用してもう一方の
画像を操作します。合成フィルタは、最大値や最小値の計算、入力画像の値の乗算などの演算処理を
実行します。合成フィルタを使用して、画像へのエフェクトの追加、画像のクロップ、その他さまざ
まなエフェクトの実現が可能です。「ブレンドモードフィルタ」を参照してください。
図 4-33 に、このセクションで示す合成例の入力として使用する 2 つの画像を示します。左の画像
は必ず前景画像として使用し、inputImage パラメータに渡します。右の画像は必ず背景画像として
使用し、inputBackgroundImage パラメータに渡します。

図 4-33:前景画像(左)と背景画像(右)

このセクションの内容:
加算合成
最大合成
最小合成
乗算合成
ソースアトップ合成
ソースイン合成
ソースアウト合成
ソースオーバー合成

加算合成
CIAdditionCompositing フィルタは、色成分を追加して、明るさを増すエフェクトを実現します。
このフィルタは通常、ハイライトおよびレンズフレアエフェクトの追加に使用します。下の画像と図
4-33 に示した 2 つの画像を比較してください。
図 4-34:CIAdditionCompositing フィルタ適用後の結果画像

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryHighDynamicRange、
kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

最大合成
CIMaximumCompositing フィルタは、2 つの入力画像の色成分ごとに最大値を計算し、それらの
最大値を使用して出力画像を作成します。これはドッジに似ています。下の画像と図 4-33 に示した
2 つの画像を比較してください。
図 4-35:CIMaximumCompositing フィルタの適用結果

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryHighDynamicRange、
kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

最小合成
CIMinimumCompositing フィルタは、2 つの入力画像の色成分ごとに最小値を計算し、それらの
最小値を使用して出力画像を作成します。これはバーンに似ています。下の画像と図 4-33 に示した
2 つの画像を比較してください。
図 4-36:CIMinimumCompositing フィルタの適用結果

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryHighDynamicRange、
kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

乗算合成
CIMultiplyCompositing フィルタは、2 つの入力画像の色成分を乗算し、それらの乗算値を使用し
て出力画像を作成します。このフィルタは通常、画像へのスポットライトまたは同様の照明エフェク
トの追加に使用します。下の画像と図 4-33 に示した 2 つの画像を比較してください。
図 4-37:CIMultiplyCompositing フィルタの適用結果

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryHighDynamicRange、
kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

ソースアトップ合成
CISourceAtopCompositing フィルタは背景画像の上に前景画像を置き、背景画像の輝度を使用し
て、表示対象を決定します。下の画像と図 4-33 に示した 2 つの画像を比較してください。図
4-38 に示すように、この合成では、背景画像と、前景画像のうち背景画像の目に見える部分に重
なっている部分のみが表示されます。
図 4-38:CISourceAtopCompositing フィルタの適用結果

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryHighDynamicRange、
kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

ソースイン合成
CISourceInCompositing フィルタは、背景画像を使用して前景画像の中で残す部分を定義すること
で、前景画像をクロップします。下の画像と図 4-33 に示した 2 つの画像を比較してください。
図 4-39:CISourceInCompositing フィルタの適用結果

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryHighDynamicRange、
kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

ソースアウト合成
CISourceOutCompositing フィルタは、背景画像を使用して、前景画像内の除外する部分を定義し
ます。下の画像と図 4-33 に示した 2 つの画像を比較してください。

図 4-40:CISourceOutCompositing フィルタの適用結果

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryHighDynamicRange、
kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

ソースオーバー合成
CISourceOverCompositing フィルタは、背景画像の上に前景画像を配置します。下の画像と図
4-33 に示した 2 つの画像を比較してください。
図 4-41:CISourceOverCompositing フィルタの適用結果

所属: kCICategoryCompositeOperation、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryHighDynamicRange、
kCICategoryBuiltIn

パラメータ
inputImage

前景画像として使用する CIImage オブジェクト。
inputBackgroundImage

背景画像として使用する CIImage オブジェクト。

歪みエフェクトフィルタ (Distortion Effect Filters)
歪みエフェクトフィルタは、ジオメトリを変更して 3D エフェクトを生み出すことで、画像を形成し
直します。歪みフィルタを使用すれば、画像の一部の移動、レンズエフェクトの適用、画像内の膨ら
みの形成、その他の芸術的なエフェクトを実現する操作の実行が可能です。図 4-42 に、このセク
ションで説明するフィルタの多くのソース画像として使用するチェッカーボード(市松模様)のパ
ターンを示します。

図 4-42:チェッカーボードソース画像

このセクションの内容:
バンプ(凹凸)歪み
円形しぶき歪み
円形状ラップ
置き換え歪み
ガラス歪み
ガラス(ひし形)
穴歪み
つまみ歪み
円環体レンズ
らせん歪み
渦巻き歪み

バンプ(凹凸)歪み
CIBumpDistortion フィルタは、画像の指定したポイントに膨らみ(バンプ)を持たせます。バンプ
は、凹状または凸状にできます。下の 2 つの結果画像と図 4-42 に示したチェッカーボードパター
ンを比較してください。左の画像は凸状の膨らみを定義した結果で、右の画像は凹状の膨らみを定
義した結果です。

図 4-43:CIBumpDistortion フィルタで処理した後の画像:凸状のバンプ(左)と凹状のバンプ
(右)

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputRadius

フィルタ処理対象の中心からの距離を指定する値(NSNumber)。
inputScale

エフェクトの方向と量を指定するスカラー値(NSNumber)。デフォルト値は -0.5 です。範囲は
-10.0 ∼ 10.0 です。値 0 は「エフェクトなし」を指定し、負の値は外向き(凸状)のバンプを生
み出し、正の値は内向き(凹状)のバンプになります。

円形しぶき歪み
CICircularSplashDistortion フィルタは、円の中心から外側へ放射するようにピクセルを変形させ
ます。下の画像と図 4-42 に示したチェッカーボードパターンを比較してください。

図 4-44:CICircularSplashDistortion フィルタで処理した後の画像

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputRadius

フィルタ処理対象の中心からの距離を指定する値(NSNumber)。デフォルト値は 150 です。範囲
は 0 ∼ 1000 です。

円形状ラップ
CICircularWrap フィルタは画像で円を包み込みます。円のアルファ値は 0.0 です。画像の歪みは、
円の中心からの距離とともに大きくなります。

図 4-45:CICircularWrap フィルタを使用したテキスト画像の処理

所属: kCICategoryTransition、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

変換元の CIImage オブジェクト。
inputAngle

包み込む対象となる円の量を指定する値(NSNumber)。負の値は右回りを指定し、正の値は左回
りを指定します。デフォルト値は 0 です。値の範囲は -pi ∼ pi です。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputRadius

フィルタ処理対象の中心からの距離を指定する値(NSNumber)。デフォルト値は 150 です。範囲
は 0 ∼ 1000 です。

置き換え歪み
CIDisplacementDistortion フィルタは、テクスチャのグレースケール値をソース画像に適用しま
す。出力画像のテクスチャは、グレースケール値によって定義されます。図 4-46 の右側の画像は、
図 4-46 の左側に示すテクスチャを使用して、図 4-42 のチェッカーボードパターンに置き換え歪
みフィルタを適用した結果です。

図 4-46:テクスチャ(左)と CIDisplacementDistortion フィルタで処理した後の画像(右)

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputDisplacementImage

置き換えマップとして使用する CIImage オブジェクト。置き換えマップが画像より小さい場合は、
最初のスキャンラインと最後のスキャンラインが同じになるように、また、最初のスキャンカラムと
最後のスキャンカラムが同じになるように、マップを用意する必要があります。これを達成するに
は、画像エディタアプリケーションを使用して、ファイルを右および下に向かって 1 ピクセル大き
くします。続いて、最初のスキャンラインを最後のスキャンラインにコピーし、最初のスキャンカラ
ムを最後のスキャンカラムにコピーします。最後に、ファイルを平坦化します。
inputScale

入力画像を、置き換えマップでどのくらい置き換えるかを指定する値(NSNumber)。デフォルト
値は 50 です。範囲は 0 ∼ 200 です。

ガラス歪み
CIGlassDistortion フィルタは、ガラスのようなテクスチャを適用して画像を歪ませます。出力画像
の突起はテクスチャマップを適用した結果です。図 4-47 に、ガラスのようなテクスチャを雲の画
像に適用した結果を示します。

図 4-47:オリジナルの雲の画像(左)と CIGlassDistortion フィルタで処理した後の画像(右)

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputTexture

テクスチャを指定する CIImage オブジェクト。このテクスチャの用意の方法については、「置き換
え歪み」を参照してください。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputScale

テクスチャに対して使用するスケーリングを指定する値(NSNumber)。範囲は 0.001 ∼ 500.0
です。デフォルト値は 200.0 です。値 2.0 はテクスチャをオリジナルのサイズで使用することを指
定します。これよりも低い値は、テクスチャを拡大して使用することを指定します。

ガラス(ひし形)
CIGlassLozenge フィルタは、ひし形状のレンズを形成し、レンズを重ねたところの画像の部分を歪
ませます。下の画像は、図 4-47 に示した雲のオリジナル画像にガラス(ひし形)フィルタを適用し
た結果です。

図 4-48:CIGlassLozenge フィルタで処理した後の画像

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputPoint0

ひし形の開始点を指定する CIVector オブジェクト。
inputPoint1

ひし形の終点を指定する CIVector オブジェクト。
inputRadius

ひし形の厚みを指定する値(NSNumber)。デフォルト値は 100 です。範囲は 0 ∼ 1000 です。
inputRefraction

ひし形の素材の屈折率を指定するスカラー値(NSNumber)。デフォルト値は 1.7 です。範囲は
-5.0 ∼ 5.0 です。さまざまな素材の概算屈折率は次のとおりです。ガラス = 1.52、水 = 1.33、空
気 = 1.0、ダイアモンド = 2.42、ルビーおよびサファイア = 1.76。ひし形状ガラスは空中にある
ものと見なします。

穴歪み
CIHoleDistortion フィルタは、画像ピクセルを外側に押し出す円形の領域を作成し、円に最も近い
ピクセルに最大の歪みが生じます。下の画像と図 4-42 に示したチェッカーボードパターンを比較し
てください。

図 4-49:CIHoleDistortion フィルタで処理した後の画像

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputRadius

穴のサイズを指定する値(NSNumber)。デフォルト値は 150 です。0.1 以上の正の値を指定する
ことができます。

つまみ歪み
CIPinchDistortion フィルタは、ソースピクセルを内側につまむ矩形の領域を作成し、矩形領域に最
も近いピクセルに最大の歪みが生じます。下の画像と図 4-42 に示したチェッカーボードパターンを
比較してください。

図 4-50:CIPinchDistortion フィルタで処理した後の画像

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputRadius

フィルタ処理対象の中心からの距離を指定する値(NSNumber)。
inputScale

エフェクトの方向と量を指定するスカラー値(NSNumber)。デフォルト値は -0.5 です。範囲は
-10.0 ∼ 10.0 です。値 0 は「エフェクトなし」を指定し、負の値では外向きに膨らんだようにな
り、正の値では内向きにつまんだようになります。

円環体レンズ
CITorusLens フィルタは、円環体形状のレンズを形成し、レンズを重ねたところの画像の部分を歪
ませます。下の画像と図 4-42 に示したオリジナル画像を比較してください。

図 4-51:CITorusLens フィルタで処理した後の画像

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputRadius

円環体レンズの外周の半径を指定する値(NSNumber)。デフォルト値は 160 です。範囲は 0 ∼
500 です。
inputWidth

円環体レンズの内周の半径から外周の半径までの相対距離を指定する値(NSNumber)。デフォル
ト値は 80 です。範囲は 0.0 ∼ 200 です。
inputRefraction

円環体レンズの素材の屈折率を指定するスカラー値(NSNumber)。デフォルト値は 1.7 です。範
囲は -5.0 ∼ 5.0 です。さまざまな素材の概算屈折率は次のとおりです。ガラス = 1.52、水 =
1.33、空気 = 1.0、ダイアモンド = 2.42、ルビーおよびサファイア = 1.76。円環体レンズは空中
にあるものと見なします。

らせん歪み
CITwirlDistortion フィルタは、点を中心にピクセルを回転して、らせんエフェクトを与えます。エ
フェクトの中心と半径に加えて、回転数も指定できます。下の画像と図 4-42 に示したオリジナル画
像を比較してください。

図 4-52:CITwirlDistortion フィルタで処理した後の画像

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputRadius

エフェクトの半径を指定する値(NSNumber)。デフォルト値は 300 です。範囲は 0 ∼ 500 で
す。
inputAngle

らせんの角度を指定する値(NSNumber)。負の値は右回りを指定し、正の値は左回りを指定しま
す。デフォルト値は pi です。値の範囲は -4 pi ∼ 4 pi です。角度の絶対値を大きくすると、エフェ
クトの回転数も増えます。

渦巻き歪み
CIVortexDistortion フィルタは、点を中心にピクセルを回転して、渦巻きをシミュレートします。
エフェクトの中心と半径に加えて、回転数も指定できます。下の画像と図 4-42 に示したチェッ
カーボードパターンを比較してください。

図 4-53:CIVortexDistortion フィルタで処理した後の画像

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputRadius

エフェクトの半径を指定する値(NSNumber)。デフォルト値は 300 です。範囲は 0 ∼ 500 で
す。
inputAngle

渦巻きの角度を指定する値(NSNumber)。負の値は右回りを指定し、正の値は左回りを指定しま
す。デフォルト値は pi です。値の範囲は -4 pi ∼ 4 pi です。角度の絶対値を大きくすると、エフェ
クトの回転数も増えます。

フォーカスフィルタ (Focus Filters)
フォーカスフィルタは、画像のソフト化またはシャープ化に使用します。アンシャープマスクは、コ
ントラストを高くし、ブラーフィルタはコントラストを低くします。図 4-54 に、テキストを含んだ
画像を示します。この画像を、本セクションに掲載した例の多くのソース画像として使用していま
す。

図 4-54:テキストを含んだ画像

このセクションの内容:
アンシャープマスク
ガウスブラー
メディアン
モーションブラー
ノイズリダクション
輝度シャープ化
ズームブラー

アンシャープマスク
CIUnsharpMask フィルタは、画像の異なる色のピクセルの間にあるエッジのコントラストを高くし
ます。下の画像と図 4-19 の画像を比較してください。

図 4-55:CIUnsharpMask フィルタで処理した後の画像

所属: kCICategorySharpen、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputIntensity

フィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値(NSNumber)。値が大き
いほど、コントラストが高くなります。デフォルト値は 0.5 です。範囲は 0.0 ∼ 1.0 です。
inputRadius

シャープ化の度合いを指定するスカラー値(NSNumber)。デフォルト値は 2.5 です。範囲は 0.0
∼ 100.0 です。

ガウスブラー
CIGaussianBlur フィルタは、ガウス分布で指定する量だけソースピクセルを展開します。下の画像
と図 4-54 に示した画像を比較してください。

図 4-56:CIGaussianBlur フィルタで処理した後の画像

所属: kCICategoryBlur、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn
パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputRadius

ガウス分布の標準偏差を指定する値(NSNumber)。デフォルト値は 10.0 です。範囲は 0.0 ∼
100.0 です。

メディアン
CIMedian フィルタは、一群の隣接するピクセルの中央値(メディアン)を計算し、各ピクセル値を
メディアンと置き換えます。エフェクトは微妙なものですが、ノイズを低減します。ソースと、図
4-57 に示す結果画像を比較してください。拡大すると、エフェクトがはっきり見えます。

図 4-57:CIMedian フィルタで処理する前後の画像

所属: kCICategoryBlur、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn
パラメータ
inputImage

処理対象の CIImage オブジェクト。

モーションブラー
CIMotionBlur フィルタは、画像にブラーを適用し、撮影中に指定の角度と距離だけ移動するカメラ
を使用したようなエフェクトをシミュレートします。下の画像と図 4-54 に示した画像を比較して
ください。

図 4-58:CIMotionBlur フィルタで処理した後の画像

所属: kCICategoryBlur、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn
パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputRadius

ブラーを適用する領域を定義する半径を指定する値(NSNumber)。デフォルト値は 20.0 です。
範囲は 0.0 ∼ 100.0 です。
inputAngle

移動の角度を指定する値(NSNumber)。デフォルト値は 0.0 です。範囲は 0.0 ∼ 2 pi です。

ノイズリダクション
CINoiseReduction フィルタは、ノイズを定義するしきい値を使用してノイズを低減します。輝度の
変化が、しきい値よりも低ければノイズと見なされ、ノイズ低減処理(部分的なブラー)が適用さ
れます。しきい値を超える変化はエッジと見なされるため、シャープ化されます。エフェクトは微妙
なものですが、図 4-59 に示すようにソース画像と結果画像を拡大して比較するとはっきり見えま
す。

図 4-59:CINoiseReduction フィルタで処理する前後の画像

所属: kCICategoryBlur、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn
パラメータ
inputImage

処理対象の CIImage オブジェクト。

inputNoiseLevel

フィルターが画像のどの部分にノイズが多いか判断するのに使用するしきい値。デフォルト値は
0.02 です。範囲は 0.0 ∼ 0.1 です。
inputSharpness

適用するシャープ化の量。デフォルト値は 0.4 です。範囲は 0.0 ∼ 2.0 です。

輝度シャープ化
CISharpenLuminance フィルタは、シャープ化によって画像の細部を強調します。このフィルタは
画像の輝度に作用しますが、ピクセルのクロミナンスは影響を受けません。エフェクトは微妙なも
のですが、図 4-60 に示すように画像を拡大して比較するとはっきり見えます。

図 4-60:CISharpenLuminance フィルタで処理する前後の画像

所属: kCICategorySharpen、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

シャープ化の対象となる CIImage オブジェクト。
inputSharpness

画像に適用する細部シャープ化の量。デフォルト値は 0.04 です。範囲は 0.0 ∼ 2.0 です。

ズームブラー
CIZoomBlur フィルタは、撮影中にカメラをズームしたようなエフェクトをシミュレートします。下
の画像と図 4-54 に示した画像を比較してください。

図 4-61:CIZoomBlur フィルタで処理した後の画像

所属: kCICategoryBlur、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn
パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputAmount
ズームのパーセンテージを指定する値(NSNumber)。デフォルト値は 20.0 です。範囲は 0.0 ∼ 200.0
です。

ジェネレータフィルタ (Generator Filters)
ジェネレータフィルタは、パターンを生成します。生成された出力は通常、別のフィルタへの入力と
して使用します。

このセクションの内容:
チェッカーボードジェネレータ
コンスタントカラージェネレータ
レンズハロージェネレータ
ランダムジェネレータ
スターシャインジェネレータ
ストライプジェネレータ
サンビーム

チェッカーボードジェネレータ
CICheckerboardGenerator フィルタはチェッカーボードパターンを生成します。チェッカーボード
のサイズ、色、およびパターンのシャープさを指定できます。図 4-62 に、シンプルな白黒のチェッ
カーボードパターンを示します。

図 4-62:CICheckerboardGenerator フィルタで生成したパターン

所属: kCICategoryGenerator、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputCenter

出力画像の中心を指定する CIVector オブジェクト。
inputColor0

チェッカーボードに使用する色を指定する CIColor オブジェクト。
inputColor1

チェッカーボードに使用する色を指定する CIColor オブジェクト。
inputWidth

チェッカーボード要素の幅を指定する値(NSNumber)。デフォルト値は 80 です。範囲は 0 ∼
800 です。
inputSharpness

パターンのシャープさを指定するスカラー値(NSNumber)。デフォルト値は 1.0 です。範囲は
0.0(ピンぼけ)∼ 1.0(シャープ)です。

コンスタントカラージェネレータ
CIConstantColorGenerator フィルタは、無地のカラーを生成します。通常、このフィルタの出力は
別のフィルタへの入力として使用します。

図 4-63:CIConstantColorGenerator フィルタで生成した色

所属: kCICategoryGenerator、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputColor

生成する色を指定する CIColor オブジェクト。

レンズハロージェネレータ
CILenticularHaloGenerator フィルタは、レンズの広がりに対応する回折によって生成されるハロー
をシミュレートします。このフィルタは通常、別の画像に適用され、レンズフレアおよび同様のエ
フェクトをシミュレートします。

図 4-64:CILenticularHaloGenerator フィルタで生成した画像

所属: kCICategoryGenerator、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputColor

ハローの色を指定する CIColor オブジェクト。

inputHaloRadius

ハローの半径を指定する値(NSNumber)。デフォルト値は 70 です。範囲は 0 ∼ 1000 です。
inputHaloWidth

ハローの幅を指定する値(NSNumber)。デフォルト値は 87 です。範囲は 0 ∼ 300 です。
inputHaloOverlap

ハローの帯が重なり合う量を指定するスカラー値(NSNumber)。デフォルト値は 0.77 です。範
囲は 0 ∼ 1 です。
inputStriationStrength

ハロー模様の輝度を指定するスカラー値(NSNumber)。デフォルト値は 0 です。範囲は 0 ∼ 3 で
す。
inputStriationContrast

ハロー模様のコントラストを指定するスカラー値(NSNumber)。デフォルト値は 1 です。範囲は
0 ∼ 5 です。
inputTime

表示時間を指定するスカラー値(NSNumber)。デフォルト値は 0 です。範囲は 0.0 ∼ 1.0 です。

ランダムジェネレータ
CIRandomGenerator フィルタは、 0 ∼ 1 の範囲に均等に分布した 4 つの独立した乱数でピクセル
値が構成される無限の大きさの画像を生成します。

図 4-65:CIRandomGenerator フィルタで生成したパターン

所属: kCICategoryGenerator、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

スターシャインジェネレータ
CIStarShineGenerator フィルタは、星形パターンを生成します。出力画像は通常、別のフィルタへ
の入力として使用します。

図 4-66:CIStarShineGenerator フィルタで生成したスターシャインパターン

所属: kCICategoryGenerator、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputCenter

星形の位置を x および y 座標で指定する CIVector オブジェクト。
inputColor

星形の中心位置の周りに拡散する光の色を指定する CIColor オブジェクト。
inputRadius

星形の半径を指定する値(NSNumber)。デフォルト値は 50 です。範囲は 0 ∼ 300 です。
inputCrossScale

星形から放射する十字型のスパイクのスケールを指定するスカラー値(NSNumber)。デフォルト
値は 15 です。範囲は 0 ∼ 100 です。

inputCrossAngle

星形の回転角をラジアンで指定する値(NSNumber)。デフォルト値は 0.6 ラジアンです。範囲は
0 ∼ 2 pi です。
inputCrossOpacity

星形から放射する十字型のスパイクの不透明度を指定するスカラー値(NSNumber)。デフォルト
値は -2 です。範囲は -8 ∼ 0 です。
inputCrossWidth

星形から放射する十字型のスパイクの幅を指定するスカラー値(NSNumber)。デフォルト値は
2.5 です。範囲は 0 ∼ 10 です。
inputEpsilon

スカラー値(NSNumber)。デフォルト値は -2 です。範囲は -8 ∼ 0 です。この値は、スター
シャインの計算で 0 による除算エラーを避けるために、Core Image が加算する小さな値の対数
(底 10)です。このイプシロン値は星の先端形状に影響を与えます。

ストライプジェネレータ
CIStripesGenerator フィルタは、ストライプパターンを生成します。ストライプの色、間隔、およ
びコントラストを制御できます。図 4-67 に、シンプルな白黒パターンを示します。

図 4-67:CIStripesGenerator フィルタで生成したストライプパターン

所属: kCICategoryGenerator、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputCenter

出力画像の中心を指定する CIVector オブジェクト。
inputColor0

奇数ストライプの色を指定する CIColor オブジェクト。
inputColor2

偶数ストライプの色を指定する CIColor オブジェクト。
inputWidth

ストライプの幅を指定する値(NSNumber)。デフォルト値は 80 です。範囲は 0 ∼ 1000 です。
inputContrast

適用するコントラストを指定するスカラー値(NSNumber)。デフォルト値は 1 です。範囲は 0.0
∼ 1.0 です。値を小さいほど、ストライプがより拡散して表示されます。

サンビーム
CISunbeams フィルタは、図 4-68 に示すような太陽放射のエフェクトを生成します。通常、サン
ビームフィルタの出力は合成フィルタへの入力として使用します。

図 4-68:CISunbeams フィルタで生成したサンビームエフェクト

所属: kCICategoryGenerator、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputColor

このエフェクトの色を指定する CIColor オブジェクト。
inputSunRadius

太陽の半径を指定する値(NSNumber)。デフォルト値は 40 です。範囲は 0 ∼ 800 です。
inputMaxStriationRadius

最大光条半径を指定するスカラー値(NSNumber)。デフォルト値は 2.58 です。範囲は 0 ∼ 10
です。
inputStriationStrength

光条強度を指定するスカラー値(NSNumber)。デフォルト値は 0.5 です。範囲は 0 ∼ 3 です。
inputStriationContrast

光条コントラストを指定するスカラー値(NSNumber)。デフォルト値は 1.375 です。範囲は 0 ∼
5 です。
inputTime

表示時間を指定するスカラー値(NSNumber)。デフォルト値は 0 です。範囲は 0.0 ∼ 1.0 です。

幾何学調節フィルタ (Geometry Adjustment Filters)
幾何学調節フィルタは、画像の幾何を変更します。これらのフィルタの一部は、画像をゆがめて芸術
的なエフェクトを実現するのに使用しますが、これらのフィルタはソース画像の問題の修正にも使用
できます。たとえば、アフィン変形を適用し、水平軸に対して回転された画像をまっすぐにすること
ができます。

このセクションの内容:
アフィン変形
クロップ
ランクゾススケール変形
アルファをマスク
パースペクティブ変形

アフィン変形
CIAffineTransform フィルタは、アフィン変形を画像に適用します。入力画像を拡大縮小、変換、
または回転することができます。下の画像と図 4-42 に示したチェッカーボードパターンを比較して
ください。

図 4-69:CIAffineTransform フィルタで処理した後の画像

所属: kCICategoryGeometryAdjustment、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputTransform

適用する変形を指定する NSAffineTransform オブジェクト。

クロップ
CICrop フィルタは画像にクロップを適用します。クロップ対象画像のサイズと形状は、指定する矩
形によって決まります。図 4-70 に、クロップフィルタを適用する前後の画像を示します。

図 4-70:CICrop フィルタで処理する前の画像(左)とした後の画像(右)

所属: kCICategoryGeometryAdjustment、kCICategoryVideo、kCICategoryStillImage,
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputRectangle

クロップ矩形の原点 (x, y)、幅、および高さを指定する 4 つの値を含む CIVector オブジェクト。

ランクゾススケール変形
CILanczosScaleTransform フィルタは、ソース画像を拡大縮小した高品質の画像を生成します。通
常、このフィルタは画像を縮小するのに使用します。このフィルタでは、CIAffineTransform フィル
タが生成する画像よりエイリアシングが少なくなります。

図 4-71:CILanczosScaleTransform フィルタで縮小する前(左)とした後の画像

所属: kCICategoryGeometryAdjustment、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputAspectRatio

x の拡大縮小に使用する値。デフォルト値は 1.0 です。範囲は 0.05 ∼ 2.0 です。
inputScale

拡大縮小係数を指定する NSNumber。デフォルト値は 1.0 です。範囲は 0.05 ∼ 1.5 です。x の拡
大縮小率は inputScale * inputAspectRatio で、y の拡大縮小率は単に inputScale です。

アルファをマスク
CIMaskToAlpha フィルタは、グレースケール画像を、アルファでマスクされた白画像に変換しま
す。ソース画像のホワイト値はマスクの内部になり、ブラック値は完全な透明になります。図 4-72
は、図 4-2 に示したグレースケール画像に CIMaskToAlpha フィルタを適用した結果です。チェッ
カーボードパターンは、ピクセルが透明の領域を示します。

図 4-72:CIMaskToAlpha フィルタで生成したアルファマスク

所属: kCICategoryColorEffect、kCICategoryVideo、kCICategoryInterlaced、
kCICategoryNonSquare、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ
inputImage

処理の対象となるグレースケール画像(CIImage オブジェクト)。

パースペクティブ変形
CIPerspectiveTransform フィルタは、画像の幾何を変えることで、観察者の視点の変化をシミュ
レートします。パースペクティブフィルタを使用すると、図 4-73 に示す例のように、画像を斜めか
ら見ることができます。この画像は、図 4-47 に示した雲のオリジナル画像にパースペクティブ変形
を適用した結果です。

図 4-73:CIPerspective フィルタで処理した後の画像

所属: kCICategoryGeometryAdjustment、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputTopLeft

画像の左上隅の新しい座標を指定する CIVector オブジェクト。
inputTopRight

画像の右上隅の新しい座標を指定する CIVector オブジェクト。
inputBottomRight

画像の右下隅の新しい座標を指定する CIVector オブジェクト。
inputBottomLeft

画像の左下隅の新しい座標を指定する CIVector オブジェクト。

グラデーションフィルタ (Gradient Filters)
グラデーションフィルタは、色がスムーズに変化する塗りを生成します。色が実際にどのように変化
するかは、グラデーションのタイプ(線形、放射状、またはガウス)によって決まります。

このセクションの内容:
線形グラデーション
放射状グラデーション
ガウスグラデーション

線形グラデーション
CILinearGradient フィルタは、定義した 2 つの端点間を直線軸に沿って変化するグラデーションを
生成します。図 4-74 に、黒から白に変化する線形グラデーションを示します。グラデーションは
他の色の間で変化することも可能です。

図 4-74:CILinearGradient フィルタで生成した線形グラデーション

所属: kCICategoryGradient、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputPoint0

グラデーションラインの開始点の座標を指定する CIVector オブジェクト。

inputPoint1

グラデーションラインの終点の座標を指定する CIVector オブジェクト。
inputColor0

開始カラーを指定する CIColor オブジェクト。
inputColor1

終了カラーを指定する CIColor オブジェクト。

放射状グラデーション
CIRadialGradient フィルタは、2 つの同心円間を放射状に変化するグラデーションを生成します。2
つの円の一方を半径 0 に設定することも可能です。図 4-75 に、黒から白に変化するグラデーショ
ンを示します。グラデーションは他の色の間で変化することも可能です。

図 4-75:CIRadialGradient フィルタで生成した放射状グラデーション

所属: kCICategoryGradient、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputRadius0

開始円の半径を指定する値(NSNumber)。半径を 0 にすることも可能です。
inputRadius1

終了円の半径を指定する値(NSNumber)。
inputColor0

開始カラーを指定する CIColor オブジェクト。
inputColor1

終了カラーを指定する CIColor オブジェクト。

ガウスグラデーション
CIGaussianGradient フィルタは、ガウス分布を使用して、ある色から別の色へ変化するグラデー
ションを生成します。図 4-76 に、黒から白に変化するグラデーションを示します。グラデーショ
ンは他の色の間で変化することも可能です。

図 4-76:CIGaussianGradient フィルタで生成したガウスグラデーション

所属: kCICategoryGradient、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ

inputCenter

グラデーションの中心の x および y 座標を指定する CIVector オブジェクト。
inputColor0

開始カラーを指定する CIColor オブジェクト。
inputColor1

終了カラーを指定する CIColor オブジェクト。
inputRadius

ガウス分布の標準偏差を指定する値(NSNumber)。デフォルト値は 300 です。範囲は 0 ∼ 800
です。

ハーフトーンエフェクトフィルタ (Halftone Effects Filters)
ハーフトーンエフェクトフィルタは、さまざまなハーフトーンスクリーンをシミュレートし、印刷メ
ディアで使用するハーフトーン処理を模倣します。これらのフィルタからの出力を見ると、さまざま
な点パターンから成る「新聞」のような見慣れた見栄えなのがわかります。それぞれのフィルタに
は、仮想ハーフトーンスクリーンで作成されるパターンにちなんだ名前が付けられています。

このセクションの内容:
円スクリーン
CMYK ハーフトーン
点スクリーン
平行線スクリーン
線スクリーン

円スクリーン
CICircularScreen フィルタは、図 4-77 に示すように、円形のハーフトーンスクリーンをシミュレー
トします。

図 4-77:CICircularScreen フィルタで生成した円スクリーンパターン

所属: kCICategoryHalftoneEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputWidth

円スクリーン要素間の距離を指定するスカラー値(NSNumber)。デフォルト値は 6 です。範囲は
1 ∼ 50 です。
inputSharpness

シャープさを指定するスカラー値(NSNumber)。デフォルト値は 0.7 です。範囲は 0 ∼ 1(最も
シャープ)です。

CMYK ハーフトーン
CICMYKHalftone フィルタは、白ページにシアン、マゼンタ、イエロー、およびブラックのインク
を使用して、ソース画像のカラーのハーフトーン表現を生成します。図 4-78 は、図 4-19 に示した
画像に CICMYKHalftone フィルタを適用した結果を示します。

図 4-78:CICMYKHalftone フィルタ適用後の画像

所属: kCIHalftoneEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

ハーフトーン点スクリーンの原点を指定する CIVector オブジェクト。
inputWidth

ワークスペースでハーフトーン点スクリーンのサイズを指定するスカラー値(NSNumber)。デフォ
ルト値は 6 です。範囲は 2.0 ∼ 100.0 です。
inputAngle

すべての点スクリーンの底角を指定するスカラー値(NSNumber)。デフォルト値は 0.0 です。範
囲は 0.0 ∼ 2 pi です。シアンの点スクリーンは底角プラス 75 度です。マゼンタの点スクリーンは
底角プラス 15 度です。イエローの点スクリーンは底角です。ブラックの点スクリーンは底角プラス
45 度です。
inputSharpness

シャープさを指定するスカラー値(NSNumber)。デフォルト値は 0.7 です。範囲は 0.0 ∼ 1.0 で
す。このパラメータは、点自体のコントラストの制御に使用します。値を大きいほど、点がシャープ
になります。
inputGCR

ブラックチャネルの計算に使用するシアン、マゼンタ、およびイエローチャネルのカラーの量。
CICMYKHalftone フィルタはスケルトンブラックを使用します。デフォルト値は 1.0 です。範囲は
0.0 ∼ 1.0 です。
inputUCR

シアン、マゼンタ、およびイエローの各チャネルから除去するブラックチャネルの量。デフォルト値
は 0.5 です。範囲は 0.0 ∼ 1.0 です。

点スクリーン
CIDotScreen フィルタは、図 4-79 に示すように、ハーフトーンスクリーンの点パターンをシミュ
レートします。

図 4-79:CIDotScreen フィルタで生成した点スクリーンパターン

所属: kCICategoryHalftoneEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputAngle

点パターンの角度を指定する値(NSNumber)。デフォルト値は 0 です。範囲は 0.0 ∼ 2 pi です。
inputWidth

ドットの幅を指定する値(NSNumber)。デフォルト値は 6 です。範囲は 1 ∼ 50 です。
inputSharpness

シャープさを指定するスカラー値(NSNumber)。デフォルト値は 0.7 です。範囲は 0 ∼ 1(最も
シャープ)です。

平行線スクリーン
CIHatchedScreen フィルタは、図 4-80 に示すように、ハーフトーンスクリーンの平行線パターン
をシミュレートします。

図 4-80:CIHatchedScreen フィルタで生成した平行線スクリーンパターン

所属: kCICategoryHalftoneEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputAngle

平行線パターンの角度を指定する値(NSNumber)。デフォルト値は 0 です。範囲は 0.0 ∼ 2 pi
です。
inputWidth

平行線要素の幅を指定する値(NSNumber)。デフォルト値は 6 です。範囲は 1 ∼ 50 です。
inputSharpness

シャープさを指定するスカラー値。デフォルト値は 0.7 です。範囲は 0 ∼ 1(最もシャープ)で
す。

線スクリーン
CILineScreen フィルタは、図 4-81 に示すように、ハーフトーンスクリーンの線パターンをシミュ
レートします。

図 4-81:CILineScreen フィルタで生成した線スクリーンパターン

所属: kCICategoryHalftoneEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputAngle

線パターンの角度を指定する値(NSNumber)。デフォルト値は 0 です。範囲は 0.0 ∼ 2 pi です。

inputWidth

線の幅を指定する値(NSNumber)。デフォルト値は 6 です。範囲は 1 ∼ 50 です。
inputSharpness

シャープさを指定するスカラー値。デフォルト値は 0.7 です。範囲は 0 ∼ 1(最もシャープ)で
す。

スタイルフィルタ (Stylize Filters)
スタイルフィルタは、写真のような画像を絵画やスケッチに見えるようにします。これらのフィルタ
は単独で、または他のフィルタと組み合わせて、芸術的なエフェクトの実現に使用します。

このセクションの内容:
ブルーム
クリスタル化
エッジワーク
エッジ
暗影
マスクからの高さフィールド
ピクセレート
ポインティライズ
シェーディングマテリアル
スポットライト

ブルーム
CIBloom フィルタは、エッジをソフト化し、気持ちのよい輝きを画像に適用します。下の画像と図
4-19 に示したオリジナル画像を比較してください。

図 4-82:CIBloom フィルタで処理した後の画像

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputRadius

フィルタ処理の対象となる領域の半径を指定する値(NSNumber)。デフォルト値は 10 です。範囲
は 0 ∼ 100 です。
inputIntensity

フィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値(NSNumber)。デフォル
ト値は 1 です。範囲は 0 ∼ 1 です。

クリスタル化
CICrystallize フィルタは、ソースピクセルのカラー値を合計して、多角形のカラーブロックを作成
します。図 4-83 の左側に示すソース画像と、右側に示す処理後の画像を比較してください。

図 4-83:CICrystallize フィルタで処理する前の画像(左)とした後の画像(右)

所属: kCICategoryTransition、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

変換元の CIImage オブジェクト。
inputCenter

エフェクトの中心を x および y 座標で指定する CIVector オブジェクト。
inputRadius

エフェクトの半径を指定する値(NSNumber)。デフォルト値は 20 です。最小値は 1 です。

エッジワーク
CIEdgeWork フィルタは、木版画のように見える、図案化されたモノクロ表現の画像を生成します。
図 4-84 に示すソース画像と、図 4-85 に示す処理後の画像を比較してください。

図 4-84:CIEdgeWork フィルタで処理する前の画像

図 4-85:CIEdgeWork フィルタで処理した後の画像

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

変換元の CIImage オブジェクト。
inputRadius

エフェクトの範囲を指定する値(NSNumber)。デフォルト値は 3.0 です。0 以上の任意の値を指
定できます。

エッジ
CIEdges エッジは、画像のあらゆるエッジを検出し、カラーで表示します。下の画像と図 4-83 の
左側に示したオリジナル画像を比較してください。

図 4-86:CIEdges フィルタで処理した後の画像

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputIntensity

フィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値(NSNumber)。デフォル
ト値は 1 です。範囲は 0 ∼ 10 です。

暗影
CIGloom フィルタは、画像のハイライトを和らげます。下の画像と図 4-19 のオリジナル画像を比
較してください。

図 4-87:CIGloom フィルタで処理した後の画像

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputRadius

エフェクトの範囲を指定する値(NSNumber)。デフォルト値は 10.0 です。範囲は 0 ∼ 100 で
す。
inputIntensity

フィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値(NSNumber)。デフォル
ト値は 1.0 です。範囲は 0 ∼ 1 です。

マスクからの高さフィールド
CIHeightFieldFromMask フィルタは、グレースケールマスクに基づいて立体感のある連続的なロフ
ト形状の高さフィールドを生成します。マスクのホワイト値は、高さフィールドの内側にあるピクセ
ルを定義し、ブラック値は外側にあるピクセルを定義します。このフィールドは、マスクの内側でス
ムーズかつ連続的に変化し、マスクのエッジで値 0 になります。このフィルタと CIShadedMaterial
フィルタを組み合わせて使用すると、きわめてリアルな陰影のあるオブジェクトを作成できます。グ
レースケールマスクを図 4-88 の左側に示し、CIHeightFieldFromMask フィルタで生成される出力
を右側に示します。

図 4-88:グレースケールマスク(左)と CIHeightFieldFromMask フィルタで生成した画像(右)

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

マスク画像として使用する CIImage オブジェクト。このマスクは、ハードエッジまたはソフトエッ
ジにできます。
inputRadius

マスクのエッジでの表面の高さ曲率の半径を指定する値(NSNumber)。デフォルト値は 10.0 で
す。範囲は 0.0 ∼ 300.0 です。

ピクセレート
CIPixellate フィルタは、画像をブロック状にします。下の画像と図 4-19 のオリジナル画像を比較
してください。

図 4-89:CIPixellate フィルタで処理した後の画像

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputScale

エフェクトが広がる距離を指定する値。デフォルト値は 8 です。範囲は 1 ∼ 100 です。

ポインティライズ
CIPointillize フィルタは、ソース画像を点描スタイルでレンダリングします。下の画像と図 4-19 の
オリジナル画像を比較してください。

図 4-90:CIPointillize フィルタで処理した後の画像

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理の対象となる CIImage オブジェクト。
inputRadius

矩形セルのサイズ(および画像のレンダリングに使用するドットのサイズ)を指定する値
(NSNumber)。デフォルト値は 20.0 です。範囲は 1.0 ∼ 100.0 です。
inputCenter

矩形セルの底辺を指定する値(NSNumber)。この値を変化させることで、フレームからフレーム
へ動作するビデオを作成できます。

シェーディングマテリアル
CIShadedMaterial フィルタは、高さフィールドから陰影のある画像を生成します。高さフィールド
は、高さが高くなるほど明るい色調になり、高さが低くなるほど(低い領域)暗い色調になるよう
に定義されます。このフィルタと CIHeightFieldFromMask フィルタを組み合わせると、テキストな
どのマスクに基づく陰影をすばやく生成できます。図 4-91 の右側に示す画像の生成には、図 4-91
の左側に示す画像を inputShadingImage パラメータとして設定し、図 4-88 の右側に示した画像
を inputImage パラメータとして設定しました。

図 4-91:シェーディング画像(左)と CIShadedMaterial フィルタで生成した画像(右)

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

高さフィールドとして使用する CIImage オブジェクトと、黒(最低の高さ)から白(最高の高さ)
に変化するグレースケール値。
inputShadingImage

陰影付きの球形画像。この画像のカラーが、高さフィールドの陰影付けに使用されます。
inputScale

高さフィールドのスケール。値が小さいほど、高さのシェーディングが強調されます。値が大きいほ
ど、スムーズで繊細な結果になります。デフォルト値は 0.1 です。範囲は 0.01 ∼ 2.0 です。

スポットライト
CISpotLight フィルタは、指向性のスポットライトエフェクトを画像に適用します。下の画像と図
4-19 のオリジナル画像を比較してください。

図 4-92:CISpotLight フィルタで処理した後の画像

所属: kCICategoryStylizeEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputLightPosition

光源の位置を指定する CIVector オブジェクト。
inputLightPointsAt

光源を向ける場所を指定する CIVector オブジェクト。
inputBrightness

画像から光源までの距離を指定する値(NSNumber)。デフォルト値は 3 です。範囲は 0 ∼ 10 で
す。
inputConcentration

ビームの収束度を指定するスカラー値(NSNumber)。デフォルト値は 0.1 です。範囲は 0.001 ∼
1.5 です。
inputColor

光源の色を指定する CIColor オブジェクト。

タイルエフェクトフィルタ (Tile Effect Filters)
タイルエフェクトフィルタは一般的に、エフェクトを画像に適用してから、当該画像を小さくした画
像(タイル)を生成し、これを配置して無限のパターンを作成します。結果の画像のいくつかはオリ
ジナルの画像を隠しますが、タイル画像の多くにオリジナルの画像を認めることができます。

このセクションの内容:
アフィンタイル
アフィンクランプ
カレイドスコープ
オプタイル
平行四辺形タイル
パースペクティブタイル
三角形タイル

アフィンタイル
CIAffineTile フィルタは、アフィン変形を画像に適用し、変形した画像をタイリングします。図
4-93 の左側に示すオリジナル画像と、図の右側に示す処理後の画像を比較してください。

図 4-93:CIAffineTile フィルタで処理する前後の画像

所属: kCICategoryTileEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputTransform

適用するアフィン変形を指定する NSTransform オブジェクト。

アフィンクランプ
CIAffineClamp フィルタは、ソース画像を対象にアフィン変形を実行し、変形した画像の端にある
ピクセルをつかんで外に向かって拡張します。このフィルタは、範囲不定の画像を生成することを除
いて、CIAffineTransform フィルタと同じように実行されます。このフィルタは、画像を不鮮明にす
る必要があるけれどもエッジに沿ってソフトな黒の縁が現れるのを避けたいときに使用できます。

図 4-19 の画像と下の画像を比較してください。つかまれたピクセルが最もよく見えるのは、トー
チの最上部と像のローブの最下部です。

図 4-94:CIAffineClamp フィルタで処理した後の画像

所属: kCICategoryTileEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputTransform

適用する変形を指定する NSAffineTransform オブジェクト。

カレイドスコープ
CIKaleidoscope フィルタは、12 方向の対称を適用することで、ソース画像に基づいて万華鏡のよ
うな画像を生成します。図 4-95 に、図 4-19 に示す画像に CIKaleidoscope フィルタを適用した
結果を示します。

図 4-95:CIKaleidoscope フィルタで処理した後の画像

所属: kCICategoryTileEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。フィルタは、指定した中心から扇形に広がるので、入力画像の
うち実際に使用されるのは 30 度のくさび形の範囲です。
inputAngle

使用するソース画像の 30 度のくさび形の底角。フィルタは、このくさび形を回転して反映すること
で、万華鏡のような結果を生みます。デフォルト値は 0.0 です。範囲は 0.0 ∼ 2pi です。
inputCenter

万華鏡の対称の中心。

オプタイル
CIOpTile フィルタは、画像を分割して、指定した拡大縮小率と回転を適用し、画像を組み立てなお
してオプティカルアートのような見栄えにします。図 4-96 のソース画像と処理後の画像を比較して
ください。

図 4-96:CIOpTile フィルタで処理する前のサンバースト画像(左)とした後の画像(右)

所属: kCICategoryTileEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputScale

タイルに適用する拡大縮小率を指定するスカラー値(NSNumber)。デフォルト値は 2.8 です。範
囲は 0 ∼ 10.0 です。
inputAngle

タイルを回転する角度を指定する値(NSNumber)。デフォルト値は 0 です。範囲は 0.0 ∼ 2 pi
です。
inputWidth

タイルの幅を指定する値(NSNumber)。デフォルト値は 65 です。範囲は 0 ∼ 1000 です。

平行四辺形タイル
CIParallelogramTile フィルタは、画像を平行四辺形に反映することで画像をゆがめて、その結果を
タイリングします。下の画像と図 4-19 のオリジナル画像を比較してください。

図 4-97:CIParallelogramTile フィルタで処理した後の画像

所属: kCICategoryTileEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputAngle

平行四辺形の最大角度をラジアンで指定する値(NSNumber)。
inputAcuteAngle

平行四辺形の最小角度をラジアンで指定する値(NSNumber)。
inputTileSize

タイルのサイズを指定する値(NSNumber)。デフォルト値は 100 です。範囲は 0 ∼ 200 です。

パースペクティブタイル
CIPerspectiveTile フィルタは、パースペクティブ変形を画像に適用し、その結果をタイリングしま
す。図 4-98 の左側に示すオリジナル画像と、図の右側にある画像を比較してください。

図 4-98:CIPerspectiveTile フィルタで処理する前後の画像

所属: kCICategoryTileEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputTopLeft

画像の左上隅の位置を指定する CIVector オブジェクト。
inputTopRight

画像の右上隅の位置を指定する CIVector オブジェクト。
inputBottomRight

画像の右下隅の位置を指定する CIVector オブジェクト。
inputBottomLeft

画像の左下隅の位置を指定する CIVector オブジェクト。

三角形タイル
CITriangleTile フィルタは、画像の三角部分を三角の領域にマップし、その結果をタイリングしま
す。下の画像と図 4-19 のオリジナル画像を比較してください。

図 4-99:CITriangleTile フィルタで処理した後の画像

所属: kCICategoryTileEffect、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

処理対象の CIImage オブジェクト。
inputCenter

フィルタ処理する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputAngle

エフェクトの角度を指定する値(NSNumber)。デフォルト値は 0 です。範囲は 0.0 ∼ 2 pi で
す。
inputWidth

タイルの幅を指定する値(NSNumber)。デフォルト値は 100 です。範囲は 0 ∼ 200 です。

トランジションフィルタ (Transition Filters)
トランジションフィルタは、ソース画像のピクセルがデスティネーション画像のピクセルにどのよう
に変化するかを定義するモーションエフェクトを適用することで、複数の画像の間の橋渡しを行い
ます。このセクションでは、各フィルタの効果がどのようなものであるか、その感触を示す図を掲載
していますが、実際にフィルタを使用して、その動作を確認するのが最善です。トランジションの大
部分には、静止画像を見ても分からない微妙な点があります。

このセクションの内容:
コピーマシントランジション
マスクからの分解
ディゾルブトランジション
フラッシュトランジション
モッドトランジション
波紋トランジション
ページカールトランジション
スワイプトランジション

コピーマシントランジション
CICopyMachineTransition フィルタは、コピーマシンのエフェクトをシミュレートすることで、あ
る画像から別の画像へ遷移します。図 4-100 に、トランジション画像およびターゲット画像、そし
てトランジション途中の状態を示します。

図 4-100:コピーマシントランジション

所属: kCICategoryTransition、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

変換元の CIImage オブジェクト。
inputTargetImage

遷移の終着点となる CIImage オブジェクト。
inputColor

トランジションカラーを指定する CIColor オブジェクト。
inputTime

コピーマシン要素の往路時間を指定する値(NSNumber)。
inputExtent

トランジションが起こる領域を示す矩形を指定するベクトル (CIVector)。
inputAngle

コピーマシン要素の角度を指定する値(NSNumber)。デフォルト値は 0 です。範囲は 0.0 ∼ 2 pi
です。

inputWidth

コピーマシン要素の幅を指定する値(NSNumber)。デフォルト値は 200 です。範囲は 0.1 ∼
1000 です。
inputReturnTime

コピーマシン要素の復路時間を指定するスカラー値(NSNumber)。デフォルト値は 0.65 です。範
囲は 0 ∼ 1 です。
inputOpacity

不透明度を指定するスカラー値(NSNumber)。デフォルト値は 1.3 です。範囲は 0.0 ∼ 3.0 で
す。

マスクからの分解
CIDisintegrateWithMask フィルタは、マスクで定義した形状を使用して、ある画像から別の画像へ
遷移します。図 4-102 に、トランジション画像およびターゲット画像、そしてトランジション途中
の状態を示します。図 4-101 に、トランジションを形成する画像マスクを示します。

図 4-101:画像マスク

図 4-102:マスクからの分解トランジション

所属: kCICategoryTransition、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

変換元の CIImage オブジェクト。
inputMaskImage

マスクとして使用する CIImage オブジェクト。
inputTargetImage

遷移の終着点となる CIImage オブジェクト。
inputTime

トランジション時間を指定する値(NSNumber)。
inputShadowRadius

マスクが生む影の半径を指定する値(NSNumber)。デフォルト値は 8 です。0 以上の正の数を指
定することができます。
inputShadowOffset

マスクが生む影のオフセットを指定するベクトル(CIVector)。デフォルトベクトルは [0 -10 0
0] です。
inputShadowDensity

マスクが生む影の濃さを指定する値(NSNumber)。デフォルト値は 0.65 です。範囲は 0.0 ∼
1.0 です。

ディゾルブトランジション
CIDissolveTransition フィルタは、ディゾルブを使用して、ある画像から別の画像へ遷移します。図
4-103 に、トランジション画像およびターゲット画像、そしてトランジション途中の状態を示しま
す。

図 4-103:ディゾルブトランジション

所属: kCICategoryTransition、kCICategoryVideo、kCICategoryStillImage、
kCICategoryInterlaced、kCICategoryNonSquarePixels、kCICategoryBuiltIn

パラメータ
inputImage

変換元の CIImage オブジェクト。
inputTargetImage

遷移の終着点となる CIImage オブジェクト。
inputTime

トランジション時間を指定する値(NSNumber)。

フラッシュトランジション
CIFlashTransition フィルタは、閃光(フラッシュ)を発して、ある画像から別の画像へ遷移しま
す。フラッシュは指定したポイントで発生します。始めは小さく、急速に広がって画像フレーム全体
がフラッシュの色で埋め尽くされます。カラーが薄れる(フェードする)につれ、ターゲット画像
が現れ始めます。図 4-104 に、トランジション途中のフラッシュを示します。

図 4-104:フラッシュトランジション

所属: kCICategoryTransition、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

変換元の CIImage オブジェクト。
inputTargetImage

遷移の終着点となる CIImage オブジェクト。
inputCenter

フラッシュが発生する領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputColor

フラッシュのカラーを指定する CIColor オブジェクト。
inputTime

トランジション時間を指定する値(NSNumber)。
inputExtent

トランジションが起こる領域を示す矩形を指定するベクトル (CIVector)。

inputMaxStriationRadius

最大光条半径を指定するスカラー値(NSNumber)。デフォルト値は 2.58 です。範囲は 0 ∼ 10
です。
inputStriationStrength

光条強度を指定するスカラー値(NSNumber)。デフォルト値は 0.5 です。範囲は 0 ∼ 3 です。
inputStriationContrast

光条コントラストを指定するスカラー値(NSNumber)。デフォルト値は 1.375 です。範囲は 0 ∼
3 です。
inputFadeThreshold

フラッシュのフェードのしきい値を指定するスカラー値(NSNumber)。デフォルト値は 0.85 で
す。範囲は 0 ∼ 1 です。

モッドトランジション
CIModTransition フィルタは、不規則な形状の穴を通してターゲット画像を表示して、ある画像か
ら別の画像へ遷移します。図 4-105 に、このトランジションフィルタがトランジション途中でどの
ように見えるか、一例を示します。

図 4-105:モッドトランジション

所属: kCICategoryTransition、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

変換元の CIImage オブジェクト。

inputTargetImage

遷移の終着点となる CIImage オブジェクト。
inputCenter

トランジション領域の中心を x および y 座標で指定する CIVector オブジェクト。
inputRadius

中心から穴のふちまでの距離を指定する値(NSNumber)。
inputTime

トランジション時間を指定する値(NSNumber)。デフォルト値は 0 です。範囲は 0 ∼ 1 です。
inputAngle

穴の角度を指定する値(NSNumber)。デフォルト値は 2 です。範囲は -2 pi ∼ 2 pi です。
inputCompression

穴に適用する圧縮を指定するスカラー値(NSNumber)。デフォルト値は 300 です。範囲は 1 ∼
800 です。

波紋トランジション
CIRippleTransition フィルタは、中心点から拡大する円形の波を作成し、波の跡を追って新しい画
像を表示することで、ある画像から別の画像へ遷移します。図 4-106 に、このフィルタがトランジ
ション途中でどのように見えるか、一例を示します。

図 4-106:波紋トランジション

所属: kCICategoryTransition、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

変換元の CIImage オブジェクト。
inputTargetImage

遷移の終着点となる CIImage オブジェクト。
inputShadingImage

アルファ値のある環境マップを指定する CIImage。通常、この画像にはハイライトとシャドウが含
まれています。
inputExtent

トランジションが起こる領域を示す矩形を指定するベクトル (CIVector)。
inputCenter

波紋の中心を x および y 座標で指定する CIVector オブジェクト。
inputTime

トランジション時間を指定する値(NSNumber)。デフォルト値は 0 です。範囲は 0 ∼ 1 です。
inputWidth

波紋の幅を指定する値(NSNumber)。デフォルト値は 30 です。範囲は 1 ∼ 1000 です。
inpuScale

変移の方向と量を指定するスカラー値(NSNumber)。デフォルト値は 50 です。範囲は -50 ∼
50 です。

ページカールトランジション
CIPageCurlTransition フィルタは、ページめくりをシミュレートし、ページめくりに合わせて新し
い画像を表示することで、ある画像から別の画像へ遷移します。図 4-107 に、トランジション画像
およびターゲット画像、そしてトランジション途中の状態を示します。

図 4-107:ページカールトランジション

所属: kCICategoryTransition、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

変換元の CIImage オブジェクト。
inputTargetImage

遷移の終着点となる CIImage オブジェクト。
inputBacksideImage

ページをめくった裏面に表示する画像を指定する CIImage。
inputShadingImage

アルファ値のある環境マップを指定する CIImage。通常、この画像にはページめくりに奥行きを与
えるハイライトとシャドウが含まれています。
inputAngle

ページめくりの角度を指定するスカラー値(NSNumber)。デフォルト値は 0 です。範囲は -pi ∼
pi です。
inputExtent

トランジションが起こる矩形を指定するベクトル(CIVector)。デフォルトベクトルは [0 0 300
300](x 原点、y 原点、幅、高さ)です。

inputRadius

ページめくりの半径を指定するスカラー値(NSNumber)。デフォルト値は 100 です。0.01 以上
の任意の正の値を指定することができます。
inputTime

トランジション時間を指定する値(NSNumber)。デフォルト値は 0 です。範囲は 0 ∼ 1 です。

スワイプトランジション
CISwipeTransition フィルタは、スワイプ(拭い取り)動作をシミュレートすることで、ある画像か
ら別の画像へ遷移します。図 4-108 に、このエフェクトがトランジション途中でどのように見える
か、一例を示します。

図 4-108:スワイプトランジション

所属: kCICategoryTransition、kCICategoryVideo、kCICategoryStillImage、
kCICategoryBuiltIn

パラメータ
inputImage

変換元の CIImage オブジェクト。
inputTargetImage

遷移の終着点となる CIImage オブジェクト。
inputColor

スワイプカラーを指定する CIColor オブジェクト。
inputTime

トランジション時間を指定する値(NSNumber)。デフォルト値は 1 です。範囲は 0 ∼ 1 です。

inputExtent

トランジションが起こる矩形を指定するベクトル(CIVector)。
inputAngle

スワイプの角度を指定する値(NSNumber)。デフォルト値は 0 です。範囲は 0.0 ∼ 2 pi です。
inputWidth

スワイプの幅を指定する値(NSNumber)。デフォルト値は 600 です。範囲は 0.1 ∼ 1000 です。
inputOpacity

不透明度を指定するスカラー値(NSNumber)。デフォルト値は 0 です。範囲は 0 ∼ 1 です。

Core Image カーネル言語
フィルタを独自に作成する場合は、カーネル言語を使用して、フィルタで使用する画像処理操作を指
定する必要があります。「サポート対象外の項目」にリストアップした項目を除き、OpenGL
Shading Language(glslang)を使用することができます。また、Core Image で定義されてい
る、「データ型、キーワード、構文、および関数」にリストアップした予約語を使用できます。
OpenGL Shading Language については以下を参照してください。

『OpenGL Shading Language』、2004 年、Addison-Wesley 刊。

3DLabs のウェブサイト、http://www.3dlabs.com/support/developer/ogl2/specs/
index.htm

目次:
サポート対象外の項目
データ型、キーワード、構文、および関数
カーネルルーチンの例

サポート対象外の項目
Core Image では、OpenGL Shading Language のソースコードプリプロセッサをサポートしてい
ません。また、以下も実装していません。

データ型:mat2、mat3、mat4、struct、arrays

ステートメント:continue、break、discard。他のフロー制御ステートメント(if、for、
while、do while)は、コードのコンパイル時にループ条件を推論できる場合にのみサポー

トされます。

式の演算子: % << >> | & ^ || && ^^ ~

組み込み関数:ftransform、matrixCompMult、dfdx、dfdy、fwidth、noise1、noise2、
noise3、noise4、refract

■ データ型、キーワード、構文、および関数
以下のセクションでは、Core Image カーネル言語が提供する予約語を示します。

「データ型」

「キーワード」

「関数」

データ型
sampler

CISampler から渡されるサンプラーを指定します。サンプラーは、データからのサンプルの取得に
使用されます。
__color

現在の CIContext 作業用色空間に対してカラーマッチングを行う必要のあるカーネルパラメータの
型を指定します。

キーワード
kernel

カーネルルーチンを指定します。カーネルルーチンの抽出とコンパイルは、CIKernel クラスが行い
ます。カーネルは、出力画像の 1 つのピクセルの計算に必要な計算をカプセル化します。各カーネ
ルの戻り型は、kernel キーワードのタグが付けられます。カーネルの基本戻り型は vec4 でなけれ
ばなりません。Core Image は、現在評価している入力ピクセルに対する出力ピクセルを返すため
に、この型を必要とします。カーネルへのパラメータはすべて暗黙的に uniform とマークされま
す。out および inout とマークされるパラメータは使用できません。カーネルルーチンには、以下
の型を渡せます。

sampler:適用する場合は、CISampler オブジェクトを必要とします。

float、vec2、vec3、vec4:NSNumber または CIVector を必要とします。

__color:プログラムに渡すときに CIContext 作業用色空間に対してカラーマッチングを行

う色。適用する場合は、CIColor オブジェクトを必要とします。カーネルプログラムからは、
プリマルチプライ済みの RGBA フォーマットの vec4 型として認識されます。
「カーネルルーチンの例」を参照してください。

関数
このセクションでは、Core Image フィルタの作成に使用できる追加関数を定義します。これらの
ルーチンは、Core Image がサポートする OpenGL カーネル言語の任意のルーチンと組み合わせて
使用できます(使用できないルーチンについては、「サポート対象外の項目」を参照)。

「compare」

「cos_」

「cossin」

「cossin_」

「destCoord」

「premultiply」

「sample」

「samplerCoord」

「samplerExtent」

「samplerOrigin」

「samplerSize」

「samplerTransform」

「sin_」

「sincos」

「sincos_」

「tan_」

「unpremultiply」

compare

genType compare (genType x, genType y, genType z)
各成分について、x < 0 ? y : z を返します。genType は、任意のベクトル型のプレースホルダで

あることに留意してください。

cos_

genType cos_ (genType x)
x が [-pi, pi] の範囲になければならないことを除き、cos (x) に似ています。genType は、任意の

ベクトル型のプレースホルダであることに留意してください。

cossin
vec2 cossin (float x)
vec2 (cos (x), sin (x)) を返します。

cossin_
vec2 cossin_ (float x)
vec2 (cos (x), sin (x)) を返します。この関数は、x が [-pi, pi] の範囲にあるものとします。

destCoord

varying vec2 destCoord ()

現在計算しているピクセルの位置を、ワークスペース座標で表して返します。

premultiply

vec4 premultiply (vec4 color)
color パラメータの赤、緑、青の成分とアルファ成分を乗算します。

sample

vec4 sample (uniform sampler src, vec2 point)
サンプラー src から生成されるピクセル値を位置 point に返します。この point はサンプラー空

間で表して指定します。

samplerCoord

varying vec2 samplerCoord (uniform sampler src)

現在の出力ピクセルに関連付けられている(すなわち、src に関連付けられている変換マトリックス
を適用した後の)サンプラー src の位置を、サンプラー空間で表して返します。

samplerExtent
uniform vec4 samplerExtent (uniform sampler src)

ワールド座標におけるサンプラーの範囲を 4 要素のベクトル [x, y, width, height] として返しま
す。

samplerOrigin
uniform vec2 samplerOrigin (uniform sampler src)
samplerExtent (src).xy と同等です。

samplerSize

uniform vec2 samplerSize (uniform sampler src)
samplerExtent (src).zw と同等です。

samplerTransform

vec2 samplerTransform (uniform sampler src, vec2 point)

ワークスペース座標で定義された位置 point に対応する(すなわち、サンプラー変換を適用した後
の)src の座標空間における位置を返します。

sin_
genType sin_ (genType x)
x が [-pi, pi] の範囲になければならないことを除き、sin (x) に似ています。genType は、任意の

ベクトル型のプレースホルダであることに留意してください。

sincos

vec2 sincos (float x)
vec2 (sin (x), cos (x)) を返します。

sincos_

vec2 sincos_ (float x)
vec2 (sin (x), cos (x)) を返します。この関数は、x が [-pi, pi] の範囲にあるものとします。

tan_

genType tan_ (genType x)

x が [-pi, pi] の範囲になければならないことを除き、tan (x) に似ています。genType は、任意の

ベクトル型のプレースホルダであることに留意してください。

unpremultiply

vec4 unpremultiply (vec4 color)
color パラメータのアルファ成分が 0 より大きい場合は、赤、緑、および青の成分をアルファで除

算します。アルファが 0 の場合、この関数は color を返します。

カーネルルーチンの例
このセクションのコードリストに、高輝度化、乗算、および穴歪みの各フィルタを使用した典型的
なカーネルルーチンを示します。カーネルルーチンを独自に作成する前に、「Core Image における
画像処理操作の表現」を読んで、Core Image において実現の難しい操作を確認してください。
リスト A-1 は高輝度化エフェクトを計算します。コードで番号を付けた各行については、リストの
後に詳しく説明します。

リスト A-1:高輝度化エフェクトを計算するカーネルルーチン
kernel vec4 brightenEffect (sampler src, float k)
{
vec4 s;

s = sample (src, samplerCoord (src));
// 1
s.rgb = s.rgb + k * s.a;
// 2
return s;
// 3
}

このコードが実行することを以下に示します。
1.

現在の出力位置と対応するサンプラーのソースピクセルを参照します。

2.

ピクセル値にバイアスを加えます。バイアスは、ピクセル値がプリマルチプライ処理されるよ
うに、k をピクセルのアルファ値でスケール調整したものです。

3.

変更を加えられたピクセルを返します。

リスト A-2 に、乗算エフェクトを計算するカーネルルーチンを示します。このコードはサンプラー
のソースピクセルを参照し、それをルーチンに渡された値で乗じます。

リスト A-2:乗算エフェクトを計算するカーネルルーチン
kernel vec4 multiplyEffect (sampler src, __color mul)
{
return sample (src, samplerCoord (src)) * mul;
}

リスト A-3 に、穴歪みを計算するカーネルルーチンを示します。コードで番号を付けた各行につい
ては、リストの後に詳しく説明します。
リスト A-3:穴歪みを計算するカーネルルーチン
kernel vec4 holeDistortion (sampler src, vec2 center, vec2 params)
// 1
{
vec2 t1;
float d0, d1;

t1
// 2
d0
// 3
t1
// 4
d0
// 5
d1
// 6
d0
// 7
t1
// 8

= destCoord () - center;
= dot (t1, t1);
= t1 * inversesqrt (d0);
= d0 * inversesqrt (d0) * params.x;
= d0 - (1.0 / d0);
= (d0 < 1.0 ?0.0 : d1) * params.y;
= t1 * d0 + center;

return sample (src, samplerTransform (src, t1));
// 9
}

このコードが実行することを以下に示します。
1.

3 つのパラメータ、すなわちサンプラー、穴歪みの中心を指定するベクトル、および(1/半
径、半径)を含む params ベクトルを受け取ります。

2.

中心から現在の作業座標へのベクトル t1 を作成します。

3.

中心からの距離を二乗し、その値を d0 変数に代入します。

4.

t1 を正規化します(t1 を単位ベクトルにします)。

5.

中心からのパラメータ距離 (距離の二乗 * 1/距離) * 1/半径 を計算しますこの値は中心で
は 0 で、距離が半径と等しい場合は 1 です。

6.

その周りに適切な歪みのある穴を作成します(x - 1/sqrt (x))。

7.

穴の内側にあるすべてのピクセルが中心のピクセルからマップされるようにし、歪み距離関数
を半径でスケールアップします。

8.

ベクトルをスケール調整して歪みを与え、中心を加算し戻します。

9.

ソーステクスチャから歪みを加えたサンプルを返します。

ドキュメント改訂履歴
下の表は、『Core Image プログラミングガイド』の改訂履歴です。
日付

メモ

Tiger

Mac OS X v10.4 の一般リリースのためのアップデート。最初の公開バージョン。

 

類似文書のタイトルとの一貫性を保つために、タイトルを『Image Processing With Core
Image』から変更。

 

Core Image の仕組みについて詳細な情報を提供するために、「Core Image の概念」全体を改
訂。

 

「Core Image Tasks」というタイトルの章を 2 つの章、「Core Image フィルタの使用」と「カ
スタムフィルタおよびイメージユニットの作成と使用」に分割。API への追加機能を反映し、詳細
な情報を提供するために、それぞれの内容を完全に更新。

 

「トランジションエフェクトの使用」を追加。

 

「動的な系のイメージング」を追加。

 

「ビデオに対するフィルタの適用」を追加。

 

「Core Image における画像処理操作の表現」を追加。

 

「Quartz Composer を使ってカーネルルーチンをテストする」を追加。

 

関心領域と ROI 関数に関する情報を追加。「関心領域」と「ROI 関数の提供」を参照。

 

実行可能および非実行可能フィルタに関する情報を追加。「実行可能および非実行可能フィル
タ」と「非実行可能フィルタの作成」を参照。

 

最近追加された Core Image の組み込みフィルタを含めるために、「Core Image フィルタ」を
更新。また、フィルタの適用結果を分かりやすくするために、多数の図を差し替え。

 

カーネル言語の変更を反映するために、「Core Image カーネル言語」を更新。カーネルルーチ
ンの例に関する説明を追加。

2004-06-29

ビデオと静止画用の組み込み画像フィルタへのアクセス、およびカスタムフィルタとリアルタイム
処理のサポートを提供する、Mac OS X v10.4 に組み込まれた画像処理テクノロジーについて説明
する新しいたたき台文案。

Sign up to vote on this title
UsefulNot useful