前回では、TableViewの代わりに「Image Kit」のIKImageBrowserView(画像ブラウザ機能)クラスを使うことに決めました。ImageBrowserと名称が付いているわけですから、画像のリストアップには最適ではないかと思うのですが、さてどうなのでしょうか?
ImageBrowserの機能を実際に使ってみる前に、せっかくですのでImage Kitを使うと何が可能なのかを調べてみましょう。まず注意すべきは、Image KitはLeopard(Mac OS X 10.5)以降でないと使用できない点です。今回開発しているアプリケーションの利用環境はMac OS X 10.5以上と設定しているので問題ありませんが、それより下位バージョンのMac OS Xも動作環境に想定されていると、残念ながらImage Kitを利用することはできません。Image Kitは「PDF Kit」や「QuartzComposer」と同様に、Quartz Frameworkに含まれています。そのクラス(ヘッダファイル)の先頭には「IK」という接頭語が付きますので、他のクラスと簡単に区別することができます。
Cocoaで画像関連のアプリケーションを開発する場合、NSImageやNSBezierPathといったCocoaネイティブの描画機能に加え、Quartz 2D、OpenGL、ImageI/O、Core Image、Core Animation、QuartzComposerといった強力なグラフィックス関連のFrameworkを利用することができます。しかし、アプリケーションの目的に応じてこれらのAPIを使いこなす事は、数多くの技術習得という意味も含め、かなり大きな労力を必要とします。そこで、グラフィックス関連で頻繁に使われる典型的な機能(ユーザ操作)を、Cocoaアプリケーションで容易に実現するためにImage Kitが提供されています。これは、QuickTime技術の習得が大変困難なのをカバーするために、より簡易的でCocoaとの親和性が高い「QTKit」が用意されているのと同じ理由です。
そう言う意味では、Image KitはMac OS Xのグラフィック能力を十二分に生かせるよう、よりローレベルのFrameworkの能力をフル活用してくれます。 Image Kitの基本的な利用方法を解説した技術ドキュメントは「Image Kit Programming Guide」です。 各クラスのメソッド等の一覧については「Image Kit Reference Collection」の方を参照してみてください。
「Image Kit Reference Collection」
Image Kitの各機能は対応するクラスに分かれ実装されていますので、まずはそれらを簡単に紹介したいと思います。各クラス定義は、Image Kitのヘッダファイルと一対一で対応していますので、その内容を参照すればさらに理解が深まると思います。
・ IKImageViewクラス
IKImageViewはNSViewのサブクラスとして実装されており、画像イメージの表示とその編集を行うことができます。「プレビュー」アプリケーションで利用されている数多くの機能が取り込まれており、このクラスを用いることで簡単に画像ビューアを作成できます。サンプルソースコードとしては「IKImageViewDemo」というビューアのデモがあったのですが、幾つかのバグのためか、現在はデベロッパサイトから削除されています。
・ IKImageEditPanelクラス
画像イメージのカラーやガンマ、エフェクトを編集するためのパネルを表示することができます。 このパネルは「プレビュー」アプリケーションで表示されるカラー調整パネルとよく似ています。
・ IKImageBrowserViewクラス
「しんぶんし3」で実装する予定のクラスです。複数の画像を表示、選択するためのブラウザ機能を提供します。 Apple社のデベロッパーサイトに、サンプルソースコードとして「ImageBrowser」が用意されています。
・IKSlideshowクラス
「Quick Look」で実行できる画像スライドショーとまったく同じスライドショーを実行することが可能となります。Apple社のデベロッパーサイトに、サンプルソースコードとして「IKSlideshowDemo」が用意されています。
・ IKPictureTakerクラス
iSightやデジタルカメラから画像(サムネイル)を取り込むことが可能です。画像にはエフェクトも加えられます。Apple社のデベロッパーサイトに、サンプルソースコードとして「PictureTaker」が用意されています。
・ IKSaveOptionsクラス
IKImageEditPanelクラスと同時に用い、画像保存時にフォーマットとオプションの設定を行います。画像ファイルに対して保存用ダイアログ(シート)を表示した時に、ポップアップメニューから画像の種類とオプション(圧縮率や圧縮の種類など)を選択することが可能です。
それ以外にも、Core Imageの機能を補完するための(Core Imageフィルタをさらに活用しやすくする)機能を幾つか有しています。Core Imageのフィルタ用ブラウザとしては IKFilterBrowserViewクラスとIKFilterBrowserPanelクラスが、フィルタのパラメータ編集用としてはIKFilterUIViewクラスが用意されています。
例えば、アプリケーションパッケージ内のResourcesフォルダからimage.jpgファイルを読み込んでKImageViewに表示させるには、おおよそ以下のようなソースコードを記述すればOKです。
IBOutlet IKImageView *imageView; // Interface Builderから
NSDictionary *imageProperties; // インスタンス変数
- (void)awakeFromNib
{
CGImageRef image=NULL
NSString *path=[[NSBundle mainBundle] pathForResource: @"image"
ofType: @"jpg"];
NSURL *url=[NSURL fileURLWithPath: path];
image=CGImageSourceCreateImageAtIndex(isr, 0, NULL); //画像を読み込み
imageProperties=(NSDictionary*)CGImageSourceCopyPropertiesAtIndex(isr,0,(CFDictionaryRef)imageProperties);
[imageView setImage: image imageProperties: _imageProperties];
// 画像と画像のプロパティを設定
[imageView setDoubleClickOpensImageEditPanel: YES];
// 色々なオプションを設定
[imageView setCurrentToolMode: IKToolModeMove];
[imageView zoomImageToFit: self];
[imageView setDelegate: self];
}
次は、 IKSlideshowクラスを用いてスライドショーを実行する場合です。スライドショーの開始ソースコードは、以下ような記述となります。
- (IBAction)start: (id)sender
{
[[IKSlideshow sharedSlideshow] runSlideshowWithDataSource: (id<IKSlideshowDataSource>)self inMode:IKSlideshowModeImages options: NULL];
}
後は、IKSlideshowDataSourceプロトコルに準拠したクラス(今回はself)を用意して slideshowItemAtIndex:メソッドで渡されるインデクス値(順番)で選択した指定オブジェクト(画像ファイルへのパスなど)を返せば、その内容を表示してくれます。
-(id)slideshowItemAtIndex: (NSUInteger)index
{
NSString *path;
// ここでインデックス値(順番)に相当する画像ファイルのパスを得る
return path;
}
スライドショーの終了ソースコードは、以下のような記述となります。
(void)stopSlideshow: (id)sender
{
[[IKSlideshow sharedSlideshow] stopSlideshow: self];
}
上記の例のように 、Imege Kitを利用すれば、割と簡単な記述のみで画像ファイルに対する高度な操作が実装できることが理解できます。次回は、実際に「しんぶんし3」にIKImageBrowserViewクラスを実装してみることにしましょう。