Apple Developer Connection
Advanced Search
Member Login Log In | Not a Member? Contact ADC

< 前ページ次ページ >

フィルタクライアントとフィルタクリエータ

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 属性値は通常、以下のいずれかのデータタイプです。

Core Image はキー値コーディングを使用します。つまり、NSKeyValueCoding プロトコルの提供するメソッドを使用することで、フィルタの属性値の取得と設定が行えます。

注:キー値コーディングは、Objective-C でオブジェクトのプロパティにアクセスするための仕組みです。Core Image を効果的に使用するには、NSKeyValueCoding プロトコルをよく知っている必要があります。詳細については、『キー値コーディング』を参照してください。

図 1-2 に示すように、一般的なフィルタの構成要素を詳しく見てみましょう。この図で影が付いている部分は、「縁の下」の部分です。この部分については、フィルタクライアントは何も知る必要はありませんが、フィルタクリエータは理解している必要があります。影が付いていない部分は、フィルタクライアントが呼び出す 2 つのメソッド、attributesoutputImage です。フィルタの attributes メソッドは、フィルタの入力パラメータや、ユーザインターフェイスでのフィルタ名の表示に使用できる文字列など、前述したフィルタ属性のリストを取得するために呼び出すものです。outputImage メソッドはフィルタを適用しますが、実際にはイメージを処理しません。このメソッドは、画像を処理するべきメソッドのように思えますが、Core Image は遅延評価を用います。つまり、Core Image は、処理済みのピクセルを実際にデスティネーションに描画するときまでは、いかなる画像も処理しません。outputImage メソッドが実行するのは、時間になったときに Core Image に必要となる計算を組み立て、その計算(すなわち、画像「製法」)を CIImage オブジェクトに格納することだけです。画像が実際にレンダリングされるのは、画像描画メソッド(drawImage:atPoint:fromRect:drawImage:inRect:fromRect: など)の明示的な呼び出しがある場合だけです。


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

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


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


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

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


フィルタクリエータの場合、フィルタの最も刺激的な構成要素はカーネルです。カーネルは、あらゆるフィルタの中心にあります。カーネルは、ソース画像の各ピクセルに対して実行される計算を指定します。カーネル計算は非常に単純なこともあれば、複雑なこともあります。「何もしない」フィルタの非常に単純なカーネルであれば、単純にソースピクセルを返すことが考えられます。

destination pixel = source pixel

フィルタクリエータは OpenGL Shading Language(gslang)のサブセットを使用して、ピクセル単位の計算を指定します(「Core Image カーネル言語」を参照)。カーネルは、フィルタクライアントに対しては不透過です。フィルタは実のところ複数のカーネルルーチンを使用して、あるルーチンの出力を別のルーチンの入力として渡すことができます。カスタムフィルタを記述する方法については、「カスタムフィルタの作成」を参照してください。

注:カーネルは Core Image に対応した gslang のサブセットを使用して書かれた実際のルーチンであり、フィルタがピクセルの処理に使用します。CIKernel オブジェクトは、カーネルルーチンを含む Core Image オブジェクトです。フィルタを作成すると、カーネルルーチンはそれぞれ専用のファイル(.cikernel 拡張子の付いたファイル)に格納されます。プログラムの中で CIKernel オブジェクトを作成するには、カーネルルーチンを含んだ文字列を渡します。

フィルタクリエータは、NSBundle が指定するアーキテクチャを使用して、カスタムフィルタをプラグイン、すなわちイメージユニットとしてパッケージ化することで、任意のアプリケーションから利用可能にできます。イメージユニットには、図 1-4 に示すように、複数のフィルタを含めることが可能です。たとえば、さまざまな種類のエッジ検出を実行する一連のフィルタを書き、それらを 1 つのイメージユニットとしてパッケージ化することができます。フィルタクライアントは Core Image API を使用してイメージユニットをロードし、そのイメージユニットに含まれているフィルタのリストを取得することができます。詳細については、「カスタムフィルタをイメージユニットとしてパッケージ化する」を参照してください。


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

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




< 前ページ次ページ >


Last updated: Tiger




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
Get information on Apple products.
Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Copyright © 2007 Apple Inc.
All rights reserved. | Terms of use | Privacy Notice