204
Core Image プログラミングガイド 概論

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

  • Upload
    nickyu

  • View
    1.658

  • Download
    9

Embed Size (px)

Citation preview

Page 1: Core Image プログラミングガイド概論

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

Page 2: 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 カーネル言語」では、カスタムフィルタ用のカーネルルーチンを作成するための言語について説明します。

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

Page 3: 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 にバンドルされているフィルタ、または自分や別の開発者が開発したフィルタを使用して、以下のタイプの操作を実行できます。■ 画像をクロップする。■ 色を補正する(ホワイトポイントの調整など)。■ カラーエフェクト(セピア調など)を適用する。■ 画像をブラーまたはシャープ化する。■ 画像を合成する。■ 画像の幾何形状を歪めたり変換したりする。■ 色、チェッカーボードパターン、ガウスグラデーション、その他のパターン画像を生成する。

Page 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 フィルタクライアントとフィルタクリエータ 処理パス ワークスペース 関心領域 実行可能フィルタおよび非実行可能フィルタ メモリ管理 色成分とプリマルチプライ済みアルファ 関連項目

Page 5: Core Image プログラミングガイド概論

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 開発者はその必要がありません。

Page 6: Core Image プログラミングガイド概論

フィルタクライアントとフィルタクリエータ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 データタイプ)。強度レベルや半径などのスカラー値の指定に使

用します。

Page 7: Core Image プログラミングガイド概論

■ ベクトル(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: など)の明示的な呼び出しがある場合だけです。

Page 8: Core Image プログラミングガイド概論

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

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

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

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

Page 9: Core Image プログラミングガイド概論

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

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 つ以上のフィルタとパッケージ化情報が含まれている

Page 10: Core Image プログラミングガイド概論

処理パス図 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 は最大限効率的に機能できます。

Page 11: Core Image プログラミングガイド概論

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

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

サンプラーは次のことを定義します。

■ 座標変換。変換が必要ない場合、これは恒等変換になる可能性があります。■ 補間モード。最近傍サンプリングまたは双一次補間(デフォルト)のいずれかです。■ ラッピングモード。サンプリング対象領域がソース画像の外である場合のピクセルの作成方法

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

ピクセル処理パスは、ソース画像からデスティネーションに向かいますが、Core Image が使用する計算パスは、図 1-6 に示すように、デスティネーションを起点とし、ソースピクセルまでさかのぼります。この逆方向の計算は扱いにくいように思えますが、実際には計算で使用するピクセル数が最

Page 12: Core Image プログラミングガイド概論

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

図 1-6:Core Image 計算パス

図 1-6 のフィルタは、ソースオーバーなど、何らかの合成操作を実行するとしましょう。フィルタクライアントは、各画像のほんの一部だけを合成して、図の左側に示す結果を達成できるように 2 つの画像を重ねることを目指します。デスティネーションのあるべき姿を予測することで、Core Image はソース画像のどのデータが最終画像に影響するかを判断し、それらのソースピクセルに計算を限定することができます。結果として、サンプラーは、図 1-6 に示したソース画像の影付きの部分からのみサンプルを取得します。

図の中で、domain of definition(定義領域)というラベルの付いたボックスに注目してください。定義領域は、計算をさらに限定する方法にすぎません。その領域以外では、すべてのピクセルが透明です(つまり、アルファコンポーネントが 0 です)。この例では、定義領域がデスティネーション画像と正確に一致しています。Core Image では、この領域を定義するために CIFilterShape オブジェクトを用意することができます。CIFilterShape は、矩形の定義、形状の変換、形状の差し

Page 13: Core Image プログラミングガイド概論

込み、結合、および交差操作を実行できるいくつかのメソッドを備えています。たとえば、図 1-6 に示した影付きの領域よりも小さい矩形を使用するフィルタ形状を定義すると、Quartz はその情報を使用して、計算で使用するソースピクセルをさらに限定します。

Core Image は他の方法でも効率的な処理を推進します。インテリジェントなキャッシュ処理およびコンパイラの最適化を行うので、リアルタイムビデオ制御のようなタスクに適しています。キャッシュされるのは、繰り返し評価される任意のデータセットの中間結果です。新しい画像を追加するとキャッシュが大きくなりすぎる場合、Core Image はもっとも長く使用していないデータを追い出します。つまり、頻繁に再利用されるオブジェクトはキャッシュに残り、時々使用されるオブジェクトは必要に応じてキャッシュから出し入れされます。キャッシュ処理がどのように実装されているか知らなくても、アプリケーションは Core Image のキャッシュ処理の恩恵を受けます。ただし、可能な限りオブジェクト(画像、コンテキストなど)を再利用することで、最高のパフォーマンスを得ることができます。

Core Image はまた、カーネルおよびパスレベルで従来のコンパイル技法を使用することで、高いパフォーマンスを実現できます。Core Image がレジスタの割り当てに使用する方法は、一時レジスタ(カーネル単位)および一時 pbuffers(フィルタグラフ単位)の数を最低限します。コンパイラは CSE およびピープホール最適化を実行し、事前計算に基づいたデータ依存テクスチャの読み取りとデータに依存していないテクスチャの読み取りを自動的に区別します。この場合も、コンパイル技法の詳細を気にする必要はありません。重要な点は、Core Image がハードウェア対応であることです。可能な限り、それも賢明な方法で、GPU のパワーを利用します。

Page 14: Core Image プログラミングガイド概論

ワークスペースCore Image はデバイス独立のワークスペースで操作を実行します。概念的には、図 1-7 に示すようなことです。つまり、Core Image ワークスペースは、理論上は範囲が無限です。ワークスペースの特定の点は、座標のペア (x, y) で表されます。ここで x は水平軸上の位置を示し、y は垂直軸上の位置を示します。座標は浮動小数点の値です。デフォルトでは、原点の座標は (0,0) です。

Core Image は画像を読み取ると、ピクセル位置をデバイス独立のワークスペース座標に変換します。処理済みの画像を表示するときに、Core Image はワークスペース座標をデスティネーション(ディスプレイなど)の適切な座標に変換します。

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

Page 15: 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 関数の提供」を参照してください。

Page 16: Core Image プログラミングガイド概論

実行可能フィルタおよび非実行可能フィルタCore Image フィルタは、CPU を使用して実行されるかどうか(CPU 実行可能および CPU 非実行可能)に基づいて分類できます。Core Image API を使用していると、これらが単に実行可能および非実行可能と呼ばれていることに気付きます。フィルタクリエータは、どちらの種類のフィルタも作成することができます。フィルタクライアントは、非実行可能のみ、または実行可能と非実行可能の両方を使用することを選べます。

CPU 実行可能フィルタと CPU 非実行可能フィルタを分けている最大の理由はセキュリティです。非実行可能フィルタは、GPU で実行するコードのみで構成されます。対照的に、実行可能フィルタには、CPU で実行するバイナリコードがあります。GPU で実行するコードは、ウイルス、トロイの木馬、その他のセキュリティ上の脅威になりませんが、CPU で実行するコードは脅威になる可能性があります。

非実行可能フィルタには、特別な要件があります。その 1 つは、非実行可能フィルタをイメージユニットの一部としてパッケージ化する必要があることです。フィルタクリエータは、詳細について「非実行可能フィルタの作成」を参照してください。フィルタクライアントは、「イメージユニットの使用」で各種フィルタのロード方法に関する情報を見つけることができます。

Page 17: Core Image プログラミングガイド概論

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

Core Image オブジェクトを使用するときには、従うべき簡単なルールがいくつかあります。

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

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

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

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

Page 18: Core Image プログラミングガイド概論

色成分とプリマルチプライ済みアルファプリマルチプライ済みアルファは、ソースカラーを表現するのに使用する用語であり、成分にアルファ値がすでに乗じてあります。プリマルチプライ処理は、各色成分の余分な乗算操作を排除することで画像のレンダリングをスピードアップします。たとえば、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 色空間に変換する必要があります。

Page 19: Core Image プログラミングガイド概論

関連項目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 から入手可能。

Page 20: Core Image プログラミングガイド概論

Core Image フィルタの使用本章では、Core Image API を使用して以下のタスクを実行する方法を示します。■ 「フィルタおよび属性のリストの取得」■ 「画像の処理」■ 「トランジションエフェクトの使用」■ 「動的な系のイメージング」■ 「ビデオに対するフィルタの適用」

Page 21: Core Image プログラミングガイド概論

■ フィルタおよび属性のリストの取得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 色調節(ガンマ調整、ホワイトポイント調整、露出など)

Page 22: Core Image プログラミングガイド概論

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

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

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

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

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

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

kCICategorySharpen シャープ化、輝度

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

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

用途 指示内容

kCICategoryStillImage 静止画に使用できる

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

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

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

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

フィルタの素性 指示内容

kCICategoryBuiltIn Core Image が提供するフィルタ

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

Page 23: Core Image プログラミングガイド概論

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 フィルタカテゴリを反復処理するわけではありませんが、このコードは同じプロセスに従って簡単に拡張することができます。

Page 24: 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 ルーチンを示します。このルーチンは、機能カテゴリの各フィルタについて属性のディクショナリを構築します。コードで番号を付けた各行については、リストの後に詳しく説明します。

Page 25: Core Image プログラミングガイド概論

リスト 2-2:フィルタのディクショナリを機能名別に構築する

- (NSMutableDictionary *)buildFilterDictionary:(NSArray *)names // 1{

NSMutableDictionary *td, *catfilters;

NSDictionary *attr;

NSString *classname;

CIFilter *filter;

int 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]; // 5

td = [NSMutableDictionary dictionary];

[td setObject:classname forKey:@"class"]; // 6 [catfilters setObject:td

forKey:[attr objectForKey:@"name"]]; // 7 }

else

NSLog(@" could not create '%@' filter", classname);

}

Page 26: Core Image プログラミングガイド概論

return catfilters;

}

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

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

2. 配列内のフィルタ名の数だけ配列の反復処理を行います。3. names 配列からフィルタ名を取り出します。4. フィルタ名に対するフィルタオブジェクトを取り出します。5. フィルタの属性ディクショナリを取り出します。6. フィルタ属性ディクショナリの名前を設定します。7. 当該フィルタのフィルタ属性ディクショナリをカテゴリフィルタディクショナリに追加しま

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

Page 27: Core Image プログラミングガイド概論

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

1. CIContext オブジェクトを作成する。2. 処理対象の画像を取得する。3. 画像に適用するフィルタに対するフィルタオブジェクトを作成する。4. フィルタのデフォルト値を設定する。5. フィルタパラメータを設定する。6. 1 つ以上のフィルタを適用する。7. 画像を描画する。各手順の実行の詳細については、以降のセクションを参照してください。図 2-1 に示す画像に 3 つのフィルタを適用する方法を説明します。

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

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

Page 28: 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 コンテキストをセットアップする方法を示します。

Page 29: 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 画像(CGImageRef)

imageWithCGImage: imageWithCGImage:options

Quartz 2D レイヤー(CGLayerRef)

imageWithCGLayer: imageWithCGLayer:options:

OpenGL テクスチャ imageWithTexture:size:flipped:colorSpace:

未加工データ imageWithBitmapData:bytesPerRow:size:format:colorSpace: imageWithImageProvider:size:width:format:colorSpace:options:

NSCIImageRep initWithBitmapImageRef:これは Application Kit 機能追加です。詳細については、NSCIImageRep を参照してください。

エンコードされたデータ(メモリ内の画像)

imageWithData: imageWithData:options:,

CVImageBuffer imageWithCVImageBuffer: imageWithCVImageBuffer:options:

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

Page 30: Core Image プログラミングガイド概論

に従ってフィルタ名のリストを取得するか、「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 に示すコードと非常に似ています。このコードは

Page 31: Core Image プログラミングガイド概論

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

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

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

入力強度は、フィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値です。最小値は 0.0、最大値は 1.0、デフォルト値は 1.0 です。

Page 32: Core Image プログラミングガイド概論

リスト 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 に、このフィルタを作成、設定し、前のフィルタ(暗影フィルタ)からの出力

Page 33: Core Image プログラミングガイド概論

画像に適用する方法を示します。ここまでくれば、エキスパートになっているはずです。まず、名前を付けてフィルタを作成します。次に、デフォルトを設定し、前の結果を入力画像として設定します。バンプ歪みは 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: は、画像の特定の領域をコンテキストデスティネーションの特定の矩形にレンダリングします。

Page 34: Core Image プログラミングガイド概論

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

[myCIContext drawImage:result

atPoint:CGPointZero

fromRect:contextRect];

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

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

Page 35: Core Image プログラミングガイド概論

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

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

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

1. トランジションに使用する Core Image 画像を作成する。2. タイマーを用意して、予定を設定する。3. CIContext オブジェクトを作成する。4. 画像に適用するフィルタに対するフィルタオブジェクトを作成する。5. フィルタのデフォルト値を設定する。6. フィルタパラメータを設定する。7. 処理対象となるソースおよびターゲット画像を設定する。8. 時間を計算する。9. フィルタを適用する。10. 結果を描画する。11. トランジションが完了するまで、手順 8 ~ 10 を繰り返す。

Page 36: Core Image プログラミングガイド概論

お気付きでしょうが、これらのタスクの多くは、トランジションフィルタ以外のフィルタを使用した画像の処理に必要なタスクと同じです。異なるのは、タイマーを用意し、トランジションが完了するまでさまざまな時間間隔でエフェクトを繰り返し描画する必要があることです。

リスト 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』の各ドキュメントを参照してください。

Page 37: Core Image プログラミングガイド概論

図 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];

Page 38: Core Image プログラミングガイド概論

[[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 Y:0 Z:w W:h];

transition = [CIFilter filterWithName:@"CICopyMachineTransition"];

[transition setDefaults];

[transition setValues:extent

forKey:@”inputExtent”];

[transition retain];

}

Page 39: Core Image プログラミングガイド概論

コピーマシントランジションエフェクト用の 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];

}

Page 40: Core Image プログラミングガイド概論

imageForTransition: ルーチンは、レンダリング時間に基づいて、どの画像がソース画像で、どれがターゲット画像であるかを判断します。そしてトランジションが繰り返しループできるように設定します。アプリケーションでループしないトランジションを適用する場合、リスト 2-11 に示す if-else 部分は必要ありません。

ルーチンは、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"];

}

else

{

[transition setValue:targetImage forKey:@"inputImage"];

[transition setValue:sourceImage forKey:@"inputTargetImage"];

}

[transition setValue:[NSNumber numberWithFloat:

0.5*(1-cos(fmodf(t, 1.0f) * M_PI))]

forKey:@"inputTime"];

Page 41: Core Image プログラミングガイド概論

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 に示します。

Page 42: Core Image プログラミングガイド概論

リスト 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 という単純なペイントアプリケーションを実装する方法について説明します。ユーザはキャンバス上でマウスをドラッグして、ペンキを適用します。ボタンを押すだけで、少量のペンキが

Page 43: Core Image プログラミングガイド概論

スプレーされます。ユーザは、カラーウエルを使用して色を変更できます。ユーザは、図 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 アプリケーションを入手し、ユーザインターフェイスルーチンの実装方法を確認することができます。イメージアキュムレータを設定して使用するのに必要なタスクについては、以降のセクションで説明します。

Page 44: Core Image プログラミングガイド概論

リスト 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)を使用して、ビューの境界に設定されます。ルーチンは、白色のコンスタント

Page 45: Core Image プログラミングガイド概論

カラージェネレータフィルタの設定と初期化も行います。その後、コンスタントカラーフィルタの出力を使用して、イメージアキュムレータ画像を初期化します。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;

}

Page 46: Core Image プログラミングガイド概論

イメージアキュムレータにフィルタを設定して適用する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"];

Page 47: Core Image プログラミングガイド概論

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

Page 48: Core Image プログラミングガイド概論

リスト 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 呼び出しのかたまりを専用の自動解放プールで囲むのが最善です。このようにすることで、アプリケーションが必要以上にメモリを使用しないようにします。画像を操作する場合、これは重要です。

Page 49: 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. 入力画像を除き、フィルタ入力パラメータを設定します。

Page 50: Core Image プログラミングガイド概論

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 メソッドでは、必ずフィルタを解放するようにします。

Page 51: Core Image プログラミングガイド概論

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

以下のセクションでは、カスタムフィルタおよびイメージユニットの作成と使用の方法に関する詳細な情報を提供します。

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

■ 「カスタムフィルタの作成」■ 「カスタムフィルタの使用」■ 「ROI 関数の提供」■ 「非実行可能フィルタの作成」■ 「カスタムフィルタをイメージユニットとしてパッケージ化する」■ 「イメージユニットの使用」

Page 52: Core Image プログラミングガイド概論

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

Page 53: Core Image プログラミングガイド概論

カスタムフィルタの作成画像処理フィルタの核心は、ピクセル計算を実行するカーネルです。このセクションでは、Objective-C 部分とカーネル部分を持つ Core Image フィルタを作成する方法について説明します。このセクションに示す手順に従って、CPU 実行可能なフィルタを作成します。作成したフィルタと、必要に応じて他のフィルタをイメージユニットとしてパッケージ化するには、「カスタムフィルタをイメージユニットとしてパッケージ化する」の手順に従います。あるいは、単にアプリケーションの中でフィルタを使用することができます。詳細については、「カスタムフィルタの使用」を参照してください。

このセクションのフィルタは、関心領域(ROI)と定義領域が一致するものと仮定しています。この仮定が当てはまらないフィルタを作成する場合は、必ず「ROI 関数の提供」も読んでください。

カスタムの CPU 実行可能フィルタを作成するには、次の手順を実行します。

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

Page 54: Core Image プログラミングガイド概論

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

カーネルコードを記述するピクセル単位の処理を実行するコードは、.cikernel 拡張子の付いたファイルにあります。このファイルには、複数のカーネルルーチンを含めることができます。コードをモジュール化するために、他の関数を含めることもできます。OpenGL Shading Language のサブセットおよび Core Image 拡張機能を使用して、カーネルを指定します。言語の使用可能な要素については、「Core Image カーネル言語」を参照してください。

カーネルルーチンシグネチャは、ソースをデスティネーションにマッピングした結果を含んだベクトル(vec4)を返す必要があります。Core Image はピクセルごとに一度だけカーネルルーチンを呼び出します。コードでは、ピクセルからピクセルへ処理が移るときに情報を蓄積できないことに留意してください。コード記述時の戦略としてよいのは、実際のカーネルからできるだけ多くの不変計算を移動し、フィルタの Objective-C 部分に配置することです。

リスト 3-1 に、かすみ除去フィルタのカーネルルーチンを示します。コードで番号を付けた各行については、リストの後に詳しく説明します。

Page 55: Core Image プログラミングガイド概論

リスト 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. 勾配と距離の計算と色の調整を組み込んだ、かすみ除去式を適用することで出力ベクトルを計算します。

Page 56: Core Image プログラミングガイド概論

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 を開き、テキストフィールドにコードをペーストするか入力するだけです。

Page 57: Core Image プログラミングガイド概論

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

コードを入力すると、図 3-3 に示すように、カーネル関数のプロトタイプに従って、パッチ入力ポートが自動的に作成されます。パッチには、カーネルが生成する結果の画像を表す 1 つの出力ポートが必ずあります。

この図に示す単純なコンポジションは、Image Importer パッチを使って画像ファイルをインポートして、カーネルで処理し、Billboard パッチを使用して画面上で結果をレンダリングします(Image Importer、Billboard の各パッチについては、『Quartz Composer Programming Guide』を参照してください)。カーネルは複数の画像を使用することも可能です。また、出力を生成する場合は入力画像を必要としないこともあります。

カーネルのテストのために構築するコンポジションは、図 3-3 に示すものより複雑になる可能性があります。たとえば、カーネルルーチンを他の組み込みの Core Image フィルタや他のカーネルルーチンと連結することも考えられます。Quartz Composer は、カーネルルーチンのテストの過程で使用できるパッチをほかにも非常に多く提供します。

Page 58: Core Image プログラミングガイド概論

図 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 ファイルは、複数のカーネルルーチンを含むことができます。コードで番号を付けた各行については、リストの後に詳しく説明します。

Page 59: Core Image プログラミングガイド概論

リスト 3-3:カーネルを初期化する init メソッド

static CIKernel *hazeRemovalKernel = nil;

- (id)init

{

if(hazeRemovalKernel == nil)// 1 {

NSBundle *bundle = [NSBundle bundleForClass:[self class]]; // 2 NSString *code = [NSString stringWithContentsOfFile:[bundle // 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 つだけ含まれます。

Page 60: Core Image プログラミングガイド概論

5. kernels 配列の最初のカーネルとして hazeRemovalKernel を設定します。.cikernel ファイルに複数のカーネルが含まれる場合は、このルーチンでそれらのカーネルも初期化する必要があります。

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

■ フィルタ名■ フィルタ表示名■ フィルタカテゴリ■ 入力および出力パラメータ■ 各パラメータの属性クラス(必須)■ 各パラメータの最小値、最大値、およびデフォルト値(任意)■ スライダー最小値および最大値など、必要に応じた他の情報(任意)

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

フィルタのクライアントは attributes メソッドを呼び出すと、定義されたフィルタ属性を得ます。

注:フィルタは、クラス以外の属性に関する情報を提供する必要はありませんが、属性が存在しない場合に適切に動作しなければなりません。

Page 61: Core Image プログラミングガイド概論

リスト 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",

Page 62: Core Image プログラミングガイド概論

[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 に示すように、要求があるとフィルタのインスタンスを作成します。

Page 63: Core Image プログラミングガイド概論

リスト 3-6:フィルタのインスタンスを作成するメソッド

+ (CIFilter *)filterWithName:(NSString *)name

{

CIFilter *filter;

filter = [[self alloc] init];

return [filter autorelease];

}

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

Page 64: Core Image プログラミングガイド概論

カスタムフィルタの使用カスタムフィルタを使用する手順は、フィルタクラスを初期化する必要があることを除けば、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"]];

Page 65: Core Image プログラミングガイド概論

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 実行可能フィルタに対してのみ提供できます。

Page 66: Core Image プログラミングガイド概論

注: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 関数 サンプラー順序の指定

Page 67: Core Image プログラミングガイド概論

簡単な 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 は画像をレンダリングできません。

Page 68: 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;

}

Page 69: Core Image プログラミングガイド概論

サンプラー順序の指定前の例で見たように、サンプラーにはインデックスが関連付けられています。ROI 関数を提供すると、Core Image によってサンプラーのインデックスが渡されます。サンプラーインデックスは、フィルタの apply メソッドに渡されるときには、その順序に基づいて割り当てられます。リスト

3-11 に示すように、フィルタの outputImage ルーチン内から apply を呼び出します。

このリストでは、特にサンプラーを用意し、カーネルに提供する方法を示す、番号の付いているコード行に注目してください。これらの各行については、リストの後に詳しく説明します。

リスト 3-11:環境マップを使用するフィルタの画像出力ルーチン

- (CIImage *)outputImage

{

int i;

CISampler *src, *blur, *env; // 1 CIVector *envscale;

CGSize size;

CIKernel *kernel;

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

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:)]; // 5

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

Page 70: Core Image プログラミングガイド概論

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 関数を確認することが重要です。

Page 71: Core Image プログラミングガイド概論

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

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

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

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

Page 72: Core Image プログラミングガイド概論

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

次の手順に従って、カスタムフィルタからイメージユニットを作成します。

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」(次へ)をクリックします。

Page 73: Core Image プログラミングガイド概論

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

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

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

Page 74: Core Image プログラミングガイド概論

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 ファイルにあるローカライズされたフィルタ名。

Page 75: Core Image プログラミングガイド概論

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/ にあります。

Page 76: Core Image プログラミングガイド概論

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

Page 77: Core Image プログラミングガイド概論

イメージユニットの使用イメージユニットは、使用の前にロードする必要があります。アプリケーションは表 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:allowNonExecutable:

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

Page 78: Core Image プログラミングガイド概論

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 カテゴリの一覧、入力パラメータの説明、フィルタを適用した結果の画像を提示します。

Page 79: Core Image プログラミングガイド概論

ブレンドモードフィルタ (Blend Mode Filters)ブレンドモードフィルタは、ある画像を別の画像に重ねてペイントする方法を指定する合成フィルタの一種です。Core Image ブレンドモードフィルタは、『PDF Reference』 (Fourth Edition、Version 1.5)で定義されているブレンドモードに基づいています。「合成フィルタ」も参照してください。

図 4-1 に、このセクションで示す合成例の入力として使用する 2 つの画像を示します。左の画像は必ず前景画像として使用し、inputImage パラメータに渡します。右の画像は必ず背景画像として使用し、inputBackgroundImage パラメータに渡します。

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

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

Page 80: Core Image プログラミングガイド概論

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

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

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

Page 81: Core Image プログラミングガイド概論

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

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

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

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

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

Page 82: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 83: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 84: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 85: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 86: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 87: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 88: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 89: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 90: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 91: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 92: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 93: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 94: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 95: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 96: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

Page 97: Core Image プログラミングガイド概論

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

このセクションの各フィルタの説明では、図 4-19 に示す「自由の女神」の画像に当該フィルタを適用した結果を示す画像を提示します。

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

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

Page 98: Core Image プログラミングガイド概論

カラーコントロール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 です。

Page 99: Core Image プログラミングガイド概論

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

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

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

パラメータ

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

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

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

Page 100: Core Image プログラミングガイド概論

図 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] です。

Page 101: Core Image プログラミングガイド概論

露出調整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 に示したオリジナル画像を比較してください。

Page 102: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 103: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

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

Page 104: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

Page 105: Core Image プログラミングガイド概論

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

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

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

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

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

パラメータ

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

inputCubeData

Page 106: Core Image プログラミングガイド概論

プリマルチプライ済みアルファを使用する浮動小数点 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 フィルタで処理した後の画像

Page 107: Core Image プログラミングガイド概論

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

パラメータ

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

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

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

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

パラメータ

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

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

Page 108: Core Image プログラミングガイド概論

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 です。

Page 109: Core Image プログラミングガイド概論

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

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

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

パラメータ

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

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

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

Page 110: Core Image プログラミングガイド概論

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

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

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

パラメータ

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

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

Page 111: Core Image プログラミングガイド概論

合成フィルタ (Compositing Filters)合成フィルタは、2 つの画像ソースを操作の対象とし、一方の画像のカラー値を使用してもう一方の画像を操作します。合成フィルタは、最大値や最小値の計算、入力画像の値の乗算などの演算処理を実行します。合成フィルタを使用して、画像へのエフェクトの追加、画像のクロップ、その他さまざまなエフェクトの実現が可能です。「ブレンドモードフィルタ」を参照してください。

図 4-33 に、このセクションで示す合成例の入力として使用する 2 つの画像を示します。左の画像は必ず前景画像として使用し、inputImage パラメータに渡します。右の画像は必ず背景画像として使用し、inputBackgroundImage パラメータに渡します。

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

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

Page 112: Core Image プログラミングガイド概論

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

図 4-34:CIAdditionCompositing フィルタ適用後の結果画像

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

パラメータ

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

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

Page 113: Core Image プログラミングガイド概論

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

図 4-35:CIMaximumCompositing フィルタの適用結果

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

パラメータ

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

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

Page 114: Core Image プログラミングガイド概論

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

図 4-36:CIMinimumCompositing フィルタの適用結果

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

パラメータ

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

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

Page 115: Core Image プログラミングガイド概論

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

図 4-37:CIMultiplyCompositing フィルタの適用結果

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

パラメータ

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

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

Page 116: Core Image プログラミングガイド概論

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

図 4-38:CISourceAtopCompositing フィルタの適用結果

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

パラメータ

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

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

Page 117: Core Image プログラミングガイド概論

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

図 4-39:CISourceInCompositing フィルタの適用結果

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

パラメータ

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

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

Page 118: Core Image プログラミングガイド概論

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

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

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

パラメータ

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

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

Page 119: Core Image プログラミングガイド概論

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

図 4-41:CISourceOverCompositing フィルタの適用結果

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

パラメータ

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

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

Page 120: Core Image プログラミングガイド概論

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

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

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

Page 121: Core Image プログラミングガイド概論

バンプ(凹凸)歪み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 は「エフェクトなし」を指定し、負の値は外向き(凸状)のバンプを生み出し、正の値は内向き(凹状)のバンプになります。

Page 122: Core Image プログラミングガイド概論

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

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

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

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

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

Page 123: Core Image プログラミングガイド概論

円形状ラップ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 です。

Page 124: Core Image プログラミングガイド概論

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

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

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

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

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

Page 125: Core Image プログラミングガイド概論

ガラス歪み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 はテクスチャをオリジナルのサイズで使用することを指定します。これよりも低い値は、テクスチャを拡大して使用することを指定します。

Page 126: Core Image プログラミングガイド概論

ガラス(ひし形)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。ひし形状ガラスは空中にあるものと見なします。

Page 127: Core Image プログラミングガイド概論

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

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

所属: kCICategoryDistortionEffect、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

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

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

Page 128: Core Image プログラミングガイド概論

つまみ歪み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 は「エフェクトなし」を指定し、負の値では外向きに膨らんだようになり、正の値では内向きにつまんだようになります。

Page 129: Core Image プログラミングガイド概論

円環体レンズ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。円環体レンズは空中にあるものと見なします。

Page 130: Core Image プログラミングガイド概論

らせん歪み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 です。角度の絶対値を大きくすると、エフェクトの回転数も増えます。

Page 131: Core Image プログラミングガイド概論

渦巻き歪み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 です。角度の絶対値を大きくすると、エフェクトの回転数も増えます。

Page 132: Core Image プログラミングガイド概論

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

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

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

Page 133: Core Image プログラミングガイド概論

アンシャープマスク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 です。

Page 134: Core Image プログラミングガイド概論

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

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

所属: kCICategoryBlur、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

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

Page 135: Core Image プログラミングガイド概論

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

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

所属: kCICategoryBlur、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

Page 136: Core Image プログラミングガイド概論

モーションブラー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 です。

Page 137: Core Image プログラミングガイド概論

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

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

所属: kCICategoryBlur、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

Page 138: Core Image プログラミングガイド概論

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

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

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

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

Page 139: Core Image プログラミングガイド概論

所属: 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 です。

Page 140: Core Image プログラミングガイド概論

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

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

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

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

所属: kCICategoryGenerator、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

Page 141: Core Image プログラミングガイド概論

パラメータ

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

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

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

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

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

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

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

Page 142: Core Image プログラミングガイド概論

所属: kCICategoryGenerator、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

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

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

所属: kCICategoryGenerator、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

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

Page 143: Core Image プログラミングガイド概論

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 フィルタで生成したパターン

Page 144: Core Image プログラミングガイド概論

所属: 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 です。

Page 145: Core Image プログラミングガイド概論

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

Page 146: Core Image プログラミングガイド概論

パラメータ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

Page 147: Core Image プログラミングガイド概論

パラメータ

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 です。

Page 148: Core Image プログラミングガイド概論

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

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

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

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

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

所属: kCICategoryGeometryAdjustment、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

Page 149: Core Image プログラミングガイド概論

パラメータ

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

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

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

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

所属: kCICategoryGeometryAdjustment、kCICategoryVideo、kCICategoryStillImage, kCICategoryBuiltIn

パラメータ

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

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

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

Page 150: Core Image プログラミングガイド概論

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

所属: kCICategoryGeometryAdjustment、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

inputAspectRatiox の拡大縮小に使用する値。デフォルト値は 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 フィルタを適用した結果です。チェッカーボードパターンは、ピクセルが透明の領域を示します。

Page 151: Core Image プログラミングガイド概論

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

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

パラメータ

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

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

Page 152: Core Image プログラミングガイド概論

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

所属: kCICategoryGeometryAdjustment、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

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

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

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

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

Page 153: Core Image プログラミングガイド概論

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

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

線形グラデーションCILinearGradient フィルタは、定義した 2 つの端点間を直線軸に沿って変化するグラデーションを生成します。図 4-74 に、黒から白に変化する線形グラデーションを示します。グラデーションは他の色の間で変化することも可能です。

図 4-74:CILinearGradient フィルタで生成した線形グラデーション

所属: kCICategoryGradient、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

inputPoint0グラデーションラインの開始点の座標を指定する CIVector オブジェクト。

Page 154: Core Image プログラミングガイド概論

inputPoint1グラデーションラインの終点の座標を指定する CIVector オブジェクト。

inputColor0開始カラーを指定する CIColor オブジェクト。

inputColor1終了カラーを指定する CIColor オブジェクト。

放射状グラデーションCIRadialGradient フィルタは、2 つの同心円間を放射状に変化するグラデーションを生成します。2 つの円の一方を半径 0 に設定することも可能です。図 4-75 に、黒から白に変化するグラデーションを示します。グラデーションは他の色の間で変化することも可能です。

図 4-75:CIRadialGradient フィルタで生成した放射状グラデーション

所属: kCICategoryGradient、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

inputRadius0

Page 155: Core Image プログラミングガイド概論

開始円の半径を指定する値(NSNumber)。半径を 0 にすることも可能です。

inputRadius1終了円の半径を指定する値(NSNumber)。

inputColor0開始カラーを指定する CIColor オブジェクト。

inputColor1終了カラーを指定する CIColor オブジェクト。

ガウスグラデーションCIGaussianGradient フィルタは、ガウス分布を使用して、ある色から別の色へ変化するグラデーションを生成します。図 4-76 に、黒から白に変化するグラデーションを示します。グラデーションは他の色の間で変化することも可能です。

図 4-76:CIGaussianGradient フィルタで生成したガウスグラデーション

所属: kCICategoryGradient、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

Page 156: Core Image プログラミングガイド概論

inputCenterグラデーションの中心の x および y 座標を指定する CIVector オブジェクト。

inputColor0開始カラーを指定する CIColor オブジェクト。

inputColor1終了カラーを指定する CIColor オブジェクト。

inputRadiusガウス分布の標準偏差を指定する値(NSNumber)。デフォルト値は 300 です。範囲は 0 ~ 800 です。

Page 157: Core Image プログラミングガイド概論

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

ハーフトーンエフェクトフィルタは、さまざまなハーフトーンスクリーンをシミュレートし、印刷メディアで使用するハーフトーン処理を模倣します。これらのフィルタからの出力を見ると、さまざまな点パターンから成る「新聞」のような見慣れた見栄えなのがわかります。それぞれのフィルタには、仮想ハーフトーンスクリーンで作成されるパターンにちなんだ名前が付けられています。

このセクションの内容:円スクリーン CMYK ハーフトーン 点スクリーン 平行線スクリーン 線スクリーン

円スクリーンCICircularScreen フィルタは、図 4-77 に示すように、円形のハーフトーンスクリーンをシミュレートします。

図 4-77:CICircularScreen フィルタで生成した円スクリーンパターン

Page 158: Core Image プログラミングガイド概論

所属: 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 フィルタ適用後の画像

Page 159: Core Image プログラミングガイド概論

所属: 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 に示すように、ハーフトーンスクリーンの点パターンをシミュレートします。

Page 160: Core Image プログラミングガイド概論

図 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(最もシャープ)です。

Page 161: Core Image プログラミングガイド概論

平行線スクリーン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

Page 162: Core Image プログラミングガイド概論

シャープさを指定するスカラー値。デフォルト値は 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 です。

Page 163: Core Image プログラミングガイド概論

inputWidth線の幅を指定する値(NSNumber)。デフォルト値は 6 です。範囲は 1 ~ 50 です。

inputSharpnessシャープさを指定するスカラー値。デフォルト値は 0.7 です。範囲は 0 ~ 1(最もシャープ)です。

Page 164: Core Image プログラミングガイド概論

スタイルフィルタ (Stylize Filters)スタイルフィルタは、写真のような画像を絵画やスケッチに見えるようにします。これらのフィルタは単独で、または他のフィルタと組み合わせて、芸術的なエフェクトの実現に使用します。

このセクションの内容:ブルーム クリスタル化 エッジワーク エッジ 暗影 マスクからの高さフィールド ピクセレート ポインティライズ シェーディングマテリアル スポットライト

Page 165: Core Image プログラミングガイド概論

ブルームCIBloom フィルタは、エッジをソフト化し、気持ちのよい輝きを画像に適用します。下の画像と図 4-19 に示したオリジナル画像を比較してください。

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

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

inputRadiusフィルタ処理の対象となる領域の半径を指定する値(NSNumber)。デフォルト値は 10 です。範囲は 0 ~ 100 です。

inputIntensityフィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値(NSNumber)。デフォルト値は 1 です。範囲は 0 ~ 1 です。

Page 166: Core Image プログラミングガイド概論

クリスタル化CICrystallize フィルタは、ソースピクセルのカラー値を合計して、多角形のカラーブロックを作成します。図 4-83 の左側に示すソース画像と、右側に示す処理後の画像を比較してください。

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

所属: kCICategoryTransition、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

inputCenterエフェクトの中心を x および y 座標で指定する CIVector オブジェクト。

inputRadiusエフェクトの半径を指定する値(NSNumber)。デフォルト値は 20 です。最小値は 1 です。

Page 167: Core Image プログラミングガイド概論

エッジワークCIEdgeWork フィルタは、木版画のように見える、図案化されたモノクロ表現の画像を生成します。図 4-84 に示すソース画像と、図 4-85 に示す処理後の画像を比較してください。

図 4-84:CIEdgeWork フィルタで処理する前の画像

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

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

Page 168: Core Image プログラミングガイド概論

パラメータ

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

inputRadiusエフェクトの範囲を指定する値(NSNumber)。デフォルト値は 3.0 です。0 以上の任意の値を指定できます。

エッジCIEdges エッジは、画像のあらゆるエッジを検出し、カラーで表示します。下の画像と図 4-83 の左側に示したオリジナル画像を比較してください。

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

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

inputIntensityフィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値(NSNumber)。デフォルト値は 1 です。範囲は 0 ~ 10 です。

Page 169: Core Image プログラミングガイド概論

暗影CIGloom フィルタは、画像のハイライトを和らげます。下の画像と図 4-19 のオリジナル画像を比較してください。

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

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

inputRadiusエフェクトの範囲を指定する値(NSNumber)。デフォルト値は 10.0 です。範囲は 0 ~ 100 です。

inputIntensityフィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値(NSNumber)。デフォルト値は 1.0 です。範囲は 0 ~ 1 です。

Page 170: Core Image プログラミングガイド概論

マスクからの高さフィールドCIHeightFieldFromMask フィルタは、グレースケールマスクに基づいて立体感のある連続的なロフト形状の高さフィールドを生成します。マスクのホワイト値は、高さフィールドの内側にあるピクセルを定義し、ブラック値は外側にあるピクセルを定義します。このフィールドは、マスクの内側でスムーズかつ連続的に変化し、マスクのエッジで値 0 になります。このフィルタと CIShadedMaterial フィルタを組み合わせて使用すると、きわめてリアルな陰影のあるオブジェクトを作成できます。グレースケールマスクを図 4-88 の左側に示し、CIHeightFieldFromMask フィルタで生成される出力を右側に示します。

図 4-88:グレースケールマスク(左)と CIHeightFieldFromMask フィルタで生成した画像(右)

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

inputImageマスク画像として使用する CIImage オブジェクト。このマスクは、ハードエッジまたはソフトエッジにできます。

inputRadiusマスクのエッジでの表面の高さ曲率の半径を指定する値(NSNumber)。デフォルト値は 10.0 です。範囲は 0.0 ~ 300.0 です。

Page 171: Core Image プログラミングガイド概論

ピクセレートCIPixellate フィルタは、画像をブロック状にします。下の画像と図 4-19 のオリジナル画像を比較してください。

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

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

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

inputScaleエフェクトが広がる距離を指定する値。デフォルト値は 8 です。範囲は 1 ~ 100 です。

ポインティライズCIPointillize フィルタは、ソース画像を点描スタイルでレンダリングします。下の画像と図 4-19 のオリジナル画像を比較してください。

Page 172: Core Image プログラミングガイド概論

図 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 パラメータとして設定しました。

Page 173: Core Image プログラミングガイド概論

図 4-91:シェーディング画像(左)と CIShadedMaterial フィルタで生成した画像(右)

所属: kCICategoryStylize、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

inputImage高さフィールドとして使用する CIImage オブジェクトと、黒(最低の高さ)から白(最高の高さ)に変化するグレースケール値。

inputShadingImage陰影付きの球形画像。この画像のカラーが、高さフィールドの陰影付けに使用されます。

inputScale高さフィールドのスケール。値が小さいほど、高さのシェーディングが強調されます。値が大きいほど、スムーズで繊細な結果になります。デフォルト値は 0.1 です。範囲は 0.01 ~ 2.0 です。

スポットライトCISpotLight フィルタは、指向性のスポットライトエフェクトを画像に適用します。下の画像と図 4-19 のオリジナル画像を比較してください。

Page 174: Core Image プログラミングガイド概論

図 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 オブジェクト。

Page 175: Core Image プログラミングガイド概論

タイルエフェクトフィルタ (Tile Effect Filters)タイルエフェクトフィルタは一般的に、エフェクトを画像に適用してから、当該画像を小さくした画像(タイル)を生成し、これを配置して無限のパターンを作成します。結果の画像のいくつかはオリジナルの画像を隠しますが、タイル画像の多くにオリジナルの画像を認めることができます。

このセクションの内容:アフィンタイル アフィンクランプ カレイドスコープ オプタイル 平行四辺形タイル パースペクティブタイル 三角形タイル

Page 176: Core Image プログラミングガイド概論

アフィンタイルCIAffineTile フィルタは、アフィン変形を画像に適用し、変形した画像をタイリングします。図 4-93 の左側に示すオリジナル画像と、図の右側に示す処理後の画像を比較してください。

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

所属: kCICategoryTileEffect、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

inputTransform適用するアフィン変形を指定する NSTransform オブジェクト。

アフィンクランプCIAffineClamp フィルタは、ソース画像を対象にアフィン変形を実行し、変形した画像の端にあるピクセルをつかんで外に向かって拡張します。このフィルタは、範囲不定の画像を生成することを除いて、CIAffineTransform フィルタと同じように実行されます。このフィルタは、画像を不鮮明にする必要があるけれどもエッジに沿ってソフトな黒の縁が現れるのを避けたいときに使用できます。

Page 177: Core Image プログラミングガイド概論

図 4-19 の画像と下の画像を比較してください。つかまれたピクセルが最もよく見えるのは、トーチの最上部と像のローブの最下部です。

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

所属: kCICategoryTileEffect、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

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

Page 178: Core Image プログラミングガイド概論

カレイドスコープ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万華鏡の対称の中心。

Page 179: Core Image プログラミングガイド概論

オプタイル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 です。

Page 180: Core Image プログラミングガイド概論

平行四辺形タイル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 です。

Page 181: Core Image プログラミングガイド概論

パースペクティブタイルCIPerspectiveTile フィルタは、パースペクティブ変形を画像に適用し、その結果をタイリングします。図 4-98 の左側に示すオリジナル画像と、図の右側にある画像を比較してください。

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

所属: kCICategoryTileEffect、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

inputTopLeft画像の左上隅の位置を指定する CIVector オブジェクト。

inputTopRight画像の右上隅の位置を指定する CIVector オブジェクト。

inputBottomRight画像の右下隅の位置を指定する CIVector オブジェクト。

inputBottomLeft画像の左下隅の位置を指定する CIVector オブジェクト。

Page 182: Core Image プログラミングガイド概論

三角形タイル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 です。

Page 183: Core Image プログラミングガイド概論

トランジションフィルタ (Transition Filters)トランジションフィルタは、ソース画像のピクセルがデスティネーション画像のピクセルにどのように変化するかを定義するモーションエフェクトを適用することで、複数の画像の間の橋渡しを行います。このセクションでは、各フィルタの効果がどのようなものであるか、その感触を示す図を掲載していますが、実際にフィルタを使用して、その動作を確認するのが最善です。トランジションの大部分には、静止画像を見ても分からない微妙な点があります。

このセクションの内容:コピーマシントランジション マスクからの分解 ディゾルブトランジション フラッシュトランジション モッドトランジション 波紋トランジション ページカールトランジション スワイプトランジション

Page 184: Core Image プログラミングガイド概論

コピーマシントランジション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 です。

Page 185: Core Image プログラミングガイド概論

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:マスクからの分解トランジション

Page 186: Core Image プログラミングガイド概論

所属: 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 です。

Page 187: Core Image プログラミングガイド概論

ディゾルブトランジションCIDissolveTransition フィルタは、ディゾルブを使用して、ある画像から別の画像へ遷移します。図 4-103 に、トランジション画像およびターゲット画像、そしてトランジション途中の状態を示します。

図 4-103:ディゾルブトランジション

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

パラメータ

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

inputTargetImage遷移の終着点となる CIImage オブジェクト。

inputTimeトランジション時間を指定する値(NSNumber)。

Page 188: Core Image プログラミングガイド概論

フラッシュトランジションCIFlashTransition フィルタは、閃光(フラッシュ)を発して、ある画像から別の画像へ遷移します。フラッシュは指定したポイントで発生します。始めは小さく、急速に広がって画像フレーム全体がフラッシュの色で埋め尽くされます。カラーが薄れる(フェードする)につれ、ターゲット画像が現れ始めます。図 4-104 に、トランジション途中のフラッシュを示します。

図 4-104:フラッシュトランジション

所属: kCICategoryTransition、kCICategoryVideo、kCICategoryStillImage、kCICategoryBuiltIn

パラメータ

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

inputTargetImage遷移の終着点となる CIImage オブジェクト。

inputCenterフラッシュが発生する領域の中心を x および y 座標で指定する CIVector オブジェクト。

inputColorフラッシュのカラーを指定する CIColor オブジェクト。

inputTimeトランジション時間を指定する値(NSNumber)。

inputExtentトランジションが起こる領域を示す矩形を指定するベクトル (CIVector)。

Page 189: Core Image プログラミングガイド概論

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 オブジェクト。

Page 190: Core Image プログラミングガイド概論

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

Page 191: Core Image プログラミングガイド概論

パラメータ

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 です。

Page 192: Core Image プログラミングガイド概論

ページカールトランジション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 原点、幅、高さ)です。

Page 193: Core Image プログラミングガイド概論

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 です。

Page 194: Core Image プログラミングガイド概論

inputExtentトランジションが起こる矩形を指定するベクトル(CIVector)。

inputAngleスワイプの角度を指定する値(NSNumber)。デフォルト値は 0 です。範囲は 0.0 ~ 2 pi です。

inputWidthスワイプの幅を指定する値(NSNumber)。デフォルト値は 600 です。範囲は 0.1 ~ 1000 です。

inputOpacity不透明度を指定するスカラー値(NSNumber)。デフォルト値は 0 です。範囲は 0 ~ 1 です。

Page 195: Core Image プログラミングガイド概論

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目次:サポート対象外の項目 データ型、キーワード、構文、および関数 カーネルルーチンの例

Page 196: Core Image プログラミングガイド概論

サポート対象外の項目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

Page 197: Core Image プログラミングガイド概論

■ データ型、キーワード、構文、および関数以下のセクションでは、Core Image カーネル言語が提供する予約語を示します。

■ 「データ型」■ 「キーワード」■ 「関数」

データ型samplerCISampler から渡されるサンプラーを指定します。サンプラーは、データからのサンプルの取得に使用されます。

__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」

Page 198: Core Image プログラミングガイド概論

■ 「cos_」■ 「cossin」■ 「cossin_」■ 「destCoord」■ 「premultiply」■ 「sample」■ 「samplerCoord」■ 「samplerExtent」■ 「samplerOrigin」■ 「samplerSize」■ 「samplerTransform」■ 「sin_」■ 「sincos」■ 「sincos_」■ 「tan_」■ 「unpremultiply」

comparegenType compare (genType x, genType y, genType z)各成分について、x < 0 ? y : z を返します。genType は、任意のベクトル型のプレースホルダであることに留意してください。

cos_genType cos_ (genType x)x が [-pi, pi] の範囲になければならないことを除き、cos (x) に似ています。genType は、任意のベクトル型のプレースホルダであることに留意してください。

cossinvec2 cossin (float x)vec2 (cos (x), sin (x)) を返します。

cossin_vec2 cossin_ (float x)vec2 (cos (x), sin (x)) を返します。この関数は、x が [-pi, pi] の範囲にあるものとします。

destCoordvarying vec2 destCoord ()現在計算しているピクセルの位置を、ワークスペース座標で表して返します。

premultiplyvec4 premultiply (vec4 color)color パラメータの赤、緑、青の成分とアルファ成分を乗算します。

Page 199: Core Image プログラミングガイド概論

samplevec4 sample (uniform sampler src, vec2 point)サンプラー src から生成されるピクセル値を位置 point に返します。この point はサンプラー空間で表して指定します。

samplerCoordvarying vec2 samplerCoord (uniform sampler src)現在の出力ピクセルに関連付けられている(すなわち、src に関連付けられている変換マトリックスを適用した後の)サンプラー src の位置を、サンプラー空間で表して返します。

samplerExtentuniform vec4 samplerExtent (uniform sampler src)ワールド座標におけるサンプラーの範囲を 4 要素のベクトル [x, y, width, height] として返します。

samplerOriginuniform vec2 samplerOrigin (uniform sampler src)samplerExtent (src).xy と同等です。

samplerSizeuniform vec2 samplerSize (uniform sampler src)samplerExtent (src).zw と同等です。

samplerTransformvec2 samplerTransform (uniform sampler src, vec2 point)ワークスペース座標で定義された位置 point に対応する(すなわち、サンプラー変換を適用した後の)src の座標空間における位置を返します。

sin_genType sin_ (genType x)x が [-pi, pi] の範囲になければならないことを除き、sin (x) に似ています。genType は、任意のベクトル型のプレースホルダであることに留意してください。

sincosvec2 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)

Page 200: Core Image プログラミングガイド概論

x が [-pi, pi] の範囲になければならないことを除き、tan (x) に似ています。genType は、任意のベクトル型のプレースホルダであることに留意してください。

unpremultiplyvec4 unpremultiply (vec4 color)color パラメータのアルファ成分が 0 より大きい場合は、赤、緑、および青の成分をアルファで除算します。アルファが 0 の場合、この関数は color を返します。

Page 201: Core Image プログラミングガイド概論

カーネルルーチンの例このセクションのコードリストに、高輝度化、乗算、および穴歪みの各フィルタを使用した典型的なカーネルルーチンを示します。カーネルルーチンを独自に作成する前に、「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 に、乗算エフェクトを計算するカーネルルーチンを示します。このコードはサンプラーのソースピクセルを参照し、それをルーチンに渡された値で乗じます。

Page 202: Core Image プログラミングガイド概論

リスト 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 = destCoord () - center;// 2 d0 = dot (t1, t1);// 3 t1 = t1 * inversesqrt (d0);// 4 d0 = d0 * inversesqrt (d0) * params.x;// 5 d1 = d0 - (1.0 / d0);// 6 d0 = (d0 < 1.0 ?0.0 : d1) * params.y; // 7 t1 = t1 * d0 + center;// 8

return sample (src, samplerTransform (src, t1)); // 9}

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

1. 3 つのパラメータ、すなわちサンプラー、穴歪みの中心を指定するベクトル、および(1/半径、半径)を含む params ベクトルを受け取ります。

2. 中心から現在の作業座標へのベクトル t1 を作成します。

Page 203: Core Image プログラミングガイド概論

3. 中心からの距離を二乗し、その値を d0 変数に代入します。4. t1 を正規化します(t1 を単位ベクトルにします)。5. 中心からのパラメータ距離 (距離の二乗 * 1/距離) * 1/半径 を計算しますこの値は中心で

は 0 で、距離が半径と等しい場合は 1 です。6. その周りに適切な歪みのある穴を作成します(x - 1/sqrt (x))。7. 穴の内側にあるすべてのピクセルが中心のピクセルからマップされるようにし、歪み距離関数

を半径でスケールアップします。8. ベクトルをスケール調整して歪みを与え、中心を加算し戻します。9. ソーステクスチャから歪みを加えたサンプルを返します。

Page 204: Core Image プログラミングガイド概論

ドキュメント改訂履歴下の表は、『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 に組み込まれた画像処理テクノロジーについて説明する新しいたたき台文案。