あ今回は、openViwerWindow()から呼ばれているimageFileToImage()ルーチンについて解説します。基本的には、画像ファイルからCore Graphics Imageを作る処理なのですが、Mac OS Xのバージョンにより、その解決方法が大きく異なります。
通常、画像ファイルから画像データを読み込む場合には、QuickTimeのGraphicsImporter APIを利用します。実際には、GetGraphicsImporterForFile()に画像ファイルのFSSpec構造体を渡し、GraphicsImportComponentを得ます。それを関連APIに渡すことで、各種画像情報や画像データを得ることや、指定CGrafPortへの描画などが可能となります。この場合、対象がどんな種類の画像ファイル(JPEGとかTIFF)なのかは、ほとんど気にする必要はありません。QuickTimeが読み込んで表示可能な画像種類であれば、すべて同様な処理を実行することができます。もし、QuickTimeが未対応の画像ファイルを処理しようとすると、GetGraphicsImporterForFile()でエラーが返りますので注意してください。
以下のimageFileToPicture()ルーチンは、GraphicsImporter APIを利用して画像ファイルからPicture(PICT)データを得る簡単な例です。

続いて、imageFileToImage()を調べてみます。今回、画像ファイルから得る必要があるのは、Core Graphics ImageのCGImageRefです。そのため、まず最初にimageFileToGworld()ルーチンを用いて、画像ファイルをオフスクリーン用に確保したGWorldへ描画してやります。そのGWorldのPixMapデータ(メモリ領域)から、Core Graphics(Quartz 2D)APIを駆使してCGImageRefを作成しています。

imageFileToGworld()ルーチンは、FSSpecから画像ファイルのGraphicsImportComponentを得て、それをオフスクリーン用に確保したGWorld(CGrafPort)へと描画します。描画先のGWolrdをGraphicsImporterに知らせるにはGraphicsImportSetGWorld()を使い、実際の描画はGraphicsImportDraw()が担当します。

上記方法では、オフスクリーン用のGWorldを確保してからCGImageRefを得ています。しかし、Mac OS X 10.4以降ではQuickDrawやGWorldといったレガシーな仕組みを極力用いないようにと、Apple社は提言しています。そのため、QuickTimeも徐々に改良が進められており、Mac OS Xのモダンな環境に対応した新APIがいくつも追加されています。例えば、Mac OS X 10.3とQuickTime 6.4以降からは、GraphicsImportCreateCGImage()という新APIが利用できます。このAPIを使えば、GraphicsImportComponentから直接Core Graphics Imageを得ることが可能です。以下に、このAPIを用いた場合のopenViwerWindow()を紹介しておきます。非常にスマートな処理となりますが、Mac OS X 10.2をアプリケーション・ターゲットに加えるとなると、この方法は採用できませんので注意してください。

次回も、openViwerWindow()内部で実行されている色々なルーチンを追跡します。実際には、画像表示用ウィンドウを作成しているcreateMyWindow()ルーチンの解説が中心となる予定です。
copyright 2005 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp