Quartz 2D でのデータ管理
データの管理は、すべてのグラフィックアプリケーションが実行する必要があるタスクです。Quartz の場合、データ管理とは、Quartz 2D ルーチンにデータを供給したり、そこからデータを受け取ったりすることを指します。いくつかの Quartz 2D ルーチンは、ファイルやアプリケーションの別の部分からイメージや PDF データを取得するものなどで、Quartz にデータを移動します。他のルーチンでは、イメージや PDF データをファイルに書き込んだり、アプリケーションの別の部分にデータを提供したりなど、Quartz データを受け取ります。
Quartz は、データを管理するためのさまざまな関数を提供します。この章を読むことで、どの関数がアプリケーションに最適かを判断できるはずです。
Quartz は、データソースと宛先の 3 つの大きなカテゴリーを認識します。
- URL。その位置を URL として指定できるデータは、データの供給者または受信者として機能できます。Quartz 関数には、Core Foundation データ型 CFURLRef を使用して URL を渡します。
- CFData。Core Foundation のデータ型 CFDataRef と CFMutableDataRef は、単純な割り当て済みバッファが Core Foundation オブジェクトの動作を引き継ぐようにするデータオブジェクトです。CFData は、Cocoa Foundation の相手である NSData クラスと"電話料無料で繋がっている" です。Cocoa フレームワークで Quartz 2D を使用している場合、CFData オブジェクトをとる全ての Quartz 関数に NSData オブジェクトを渡すことができます。
- 生のデータ。データの基本的なメモリ管理を担当する一連の呼び出し関数とともに、あらゆる型のデータへのポインタを提供できます。
データ自体は、URL、CFData オブジェクト、またはデータバッファで表されるかどうかに関わらず、イメージデータまたは PDF データである可能性があります。イメージデータは任意の型のファイル形式を使用できます。Quartz は、一般的なイメージファイル形式のほとんどを理解します。いくつかの Quartz データ管理関数はイメージデータで特に動作しますが、PDF データのみで動作するものもあれば、PDF やイメージデータに使用できるものもあります。
図 10-1 に示したように、URL、CFData、生のデータソース、および宛先は、Mac OS X または iOS グラフィックス技術の領域外のデータを参照します。Mac OS X または iOS の他のグラフィックス技術は、Quartz と通信するための独自のルーチンを提供することがよくあります。たとえば、Mac OS X アプリケーションは Quartz イメージを Core Image に送信し、それを使って洗練された効果でイメージを変更できます。
図 10-1 Mac OS X で Quartz 2D との間でデータを出し入れする
Quartz 2D へのデータの移動
データソースからデータを取得する関数を 表 10-1 に示します。CGPDFDocumentCreateWithURL を除くこれらのすべての関数は、イメージソース(CGImageSourceRef) またはデータプロバイダ(CGDataProviderRef) のどちらかを返します。イメージソースおよびデータプロバイダは、データアクセスのタスクを抽象化し、アプリケーションが生のメモリバッファを介してデータを管理する必要性を排除します。
イメージソースは、イメージデータを Quartz に移動するためのより良い方法です。イメージソースは、多種多様なイメージデータを表します。イメージソースには、イメージとサムネイルイメージ、および各イメージとイメージファイルのプロパティを複数含めることができます。CGImageSourceRef を取得したら、以下のタスクを果たす事ができます。
- CGImageSourceCreateImageAtIndex、CGImageSourceCreateThumbnailAtIndex、または CGImageSourceCreateIncremental 関数を使用してイメージ(CGImageRef) を作成します。CGImageRef データ型は、単一の Quartz イメージを表します。
- CGImageSourceUpdateData または CGImageSourceUpdateDataProvider 関数を使用して、イメージソースにコンテンツを追加します。
- CGImageSourceGetCount、CGImageSourceCopyProperties、および CGImageSourceCopyTypeIdentifiers 関数を使用して、イメージソースから情報を取得します。
CGPDFDocumentCreateWithURL 関数は、指定された URL に位置するファイルから PDF 文書を作成するコンビニエンス関数です。
データプロバイダは、機能がより限定された古い機構です。イメージや PDF データを取得するのに使用できます。
以下の関数にデータプロバイダを提供できます:
- CGImageCreate、CGImageCreateWithPNGDataProvider、CGImageCreateWithJPEGDataProvider などのイメージ作成関数。
- PDF 文書作成関数 CGPDFDocumentCreateWithProvider。
- 既存のイメージソースを新しいデータで更新する CGImageSourceUpdateDataProvider 関数。
イメージの詳細については、ビットマップイメージとイメージマスク を参照してください。
表 10-1 データを Quartz 2D に移動する関数
関数 | 関数の使用 |
---|---|
CGImageSourceCreateWithDataProvider | データプロバイダからイメージソースを作成する |
CGImageSourceCreateWithData | CFData オブジェクトからイメージソースを作成する |
CGImageSourceCreateWithURL | イメージデータの位置を指定する URL からイメージソースを作成する |
CGPDFDocumentCreateWithURL | 指定された URL にあるデータから PDF 文書を作成する |
CGDataProviderCreateSequential | ストリーム内のイメージまたは PDF データを読み込む。データを処理する呼び出し関数を提供する |
CGDataProviderCreateDirectAccess | ブロック内のイメージまたは PDF データを読み込む。データを処理する呼び出し関数を提供する |
CGDataProviderCreateWithData | アプリケーションが提供するイメージまたは PDF データのバッファを読み込む。データに割り当てたメモリを解放する呼び出し関数を提供する |
CGDataProviderCreateWithURL | イメージや PDF データへのデータアクセスの対象を指定する URL を指定できる時いつでも。 |
CGDataProviderCreateWithCFData | CFData オブジェクトからイメージまたは PDF データを読み込む。 |
Quartz 2D からのデータの移動
表 10-2 に示す関数は、Quartz 2D からデータを移動します。CGPDFContextCreateWithURL を除くこれらすべての関数は、イメージの宛先(CGImageDestinationRef) またはデータコンシューマ(CGDataConsumerRef) を返します。イメージの宛先とデータコンシューマはデータ書き込みタスクを抽象化し、Quartz が詳細を処理するようにします。
イメージの宛先は Quartz からイメージデータを移動するのにより良い方法です。イメージソースと同様に、イメージの宛先は、単一のイメージから複数のイメージ、サムネイルイメージ、および各イメージまたはイメージファイルのプロパティを含む宛先まで、さまざまなイメージデータを表すことができます。CGImageDestinationRef を取得したら、以下のタスクを果たす事ができます。
- CGImageDestinationAddImage または CGImageDestinationAddImageFromSource 関数を使用して、イメージ(CGImageRef) を宛先に追加します。CGImageRef データ型は、単一の Quartz イメージを表します。
- CGImageDestinationSetProperties 関数を使用してプロパティを設定します。
- CGImageDestinationCopyTypeIdentifiers または CGImageDestinationGetTypeID 関数を使用して、イメージの宛先から情報を取得します。
CGPDFContextCreateWithURL 関数は、PDF データを URL で指定された位置に書き込むコンビニエンス関数です。
データコンシューマは、より限定された機能を備えた古いメカニズムです。これらは、イメージまたは PDF データを書き込むために使用されます。データコンシューマには、以下のものを提供できます:
- PDF コンテキスト作成関数 CGPDFContextCreate。この関数は、データコンシューマオブジェクトに渡される一連の PDF 描画コマンドとして描画を記録するグラフィックスコンテキストを返します。
- データコンシューマからイメージの宛先を作成する関数 CGImageDestinationCreateWithDataConsumer。
イメージの詳細については、ビットマップイメージとイメージマスク を参照してください。
表 10-2 Quartz 2D からデータを移動する関数
関数 | 関数の使用 |
---|---|
CGImageDestinationCreateWithDataConsumer | イメージデータをデータコンシューマに書き込む |
CGImageDestinationCreateWithData | イメージデータを CFData オブジェクトに書き込む |
CGImageDestinationCreateWithURL | イメージデータを書き込む位置を指定する URL を指定できる時はいつでも |
CGPDFContextCreateWithURL | PDF データを書き込む位置を指定する URL を指定できる時はいつでも |
CGDataConsumerCreateWithURL | イメージや PDF データの書き込む位置を指定する URL を指定できる時はいつでも |
CGDataConsumerCreateWithCFData | イメージまたは PDF データを CFData オブジェクトに書き込む |
CGDataConsumerCreate | 提供している呼び出し関数を使ってイメージや PDF データを書き込む |
Mac OS X で Quartz 2D と Core Image 間でデータを移動
Core Image フレームワークは、Mac OS X で提供される Objective-C API であり、イメージ処理をサポートしています。Core Image を使用すると、ビデオと静止画の両方のためのビルトインイメージフィルタにアクセスでき、カスタムフィルタと、ほぼリアルタイムの処理をサポートします。Core Image フィルタを Quartz 2D イメージに適用できます。たとえば、Core Image を使用して色を補正したり、イメージの図形を歪めたり、イメージをぼかしたり、鮮明にしたり、イメージ間の推移を作成したりできます。Core Image では、またフィルタ操作の出力を入力にフィードバックするイメージへの反復処理も適用できます。Core Image の能力をより詳しく理解するには、Core Image プログラミングガイド を参照してください。
Core Image のメソッドは、Core Image のイメージまたは CIImage オブジェクトとしてパッケージ化されたイメージを操作します。Core Image は、Quartz イメージ(CGImageRef データ型) 上には直接操作しません。Core Image フィルタをイメージに適用する前に、Quartz イメージを Core Image のイメージに変換しなければなりません。
Quartz 2D API は、Quartz イメージを Core Image のイメージとしてパッケージ化する関数は全く提供しませんが、Core Image は提供します。以下の Core Image のメソッドは、Quartz イメージまたは Quartz レイヤー(CGLayerRef) のいずれかから Core Image のイメージを作成します。それらを使用して、Quartz 2D データを Core Image に移動できます。
- imageWithCGImage:
- imageWithCGImage:options:
- imageWithCGLayer:
- imageWithCGLayer:options:
以下の Core Image のメソッドは、Core Image のイメージから Quartz イメージを返します。これらを使って、処理されたイメージを Quartz 2D に戻すことができます:
- createCGImage:fromRect:
- createCGLayerWithSize:info:
Core Image メソッドの詳細については、Core Image リファレンス集 を参照してください。
前の章 次の章