フォーマット変換のオプション指定
Image Kitは、画像のフォーマットの変換に対するサポートもある。これを紹介しよう。
実際のところ、フォーマットの変換そのものは、CocoaやCore Graphicsを使って行う。Image Kitの登場以前から実現出来ていた訳だ。では、Image Kitで新しく追加された、フォーマット変換をサポートするものは何かというと、オプションを設定するためのアクセサリビューになる。
アクセサリビューとは、保存ダイアログの下側に追加出来るビューのことだ。ここで、保存に関する様々な設定を追加することが出来る。
Image Kitが提供する、オプションのためのアクセサリビューとはどういうものかというと、プレビューで画像の書き出しを行うときのことを思い出してほしい。保存ダイアログが拡張されて、変換するフォーマットを選択でき、それぞれのフォーマットに対応して細かい設定を行うことが出来た。
Image Kitを使えば、これとほぼ同じものが利用出来ると考えてほしい。
IKSaveOptionsクラス
このために使うのが、IKSaveOptionsというクラスだ。このクラスがアクセサリビューを提供し、ユーザの設定項目を管理してくれる。
フォーマットの設定項目は、フォーマットのUTI(Uniform Type Identifier)名と、そのプロパティから構成される。UTIは、Appleが定める汎用的なフォーマット識別子だ。フォーマットの種類は、これを使って指定することになる。
IKSaveOptionsで指定可能な、フォーマットとそのUTI名を紹介しよう。
GIF com.compuserve.gif
JPEG public.jpeg
JPEG-2000 public.jpeg-2000
Micosfot BMP com.microsoft.bmp
OpenEXR com.ilm.openexr-image
PDF com.adobe.pdf
Photoshop com.adobe.photoshop-image
PICT com.apple.pict
PNG public.png
SGI com.sgi.sgi-image
TGA com.truevision.tga-image
TIFF public.tiff
プロパティは、フォーマットごとに決まっている保存時の設定だ。これは、Core Graphicsのものに準じることになる。
保存ダイアログの表示とフォーマットの変換
では、IKSaveOptionsを使ってみよう。まず、インスタンスを作成する。initWithImageProperties:imageUTType:メソッドを使う。
IKSaveOptions.h
- (id)initWithImageProperties:(NSDictionary*)imageProperties imageUTType: (NSString*)imageUTType;
引数としてプロパティとUTIを指定するが、これは初期設定として使われる。デフォルトでかまわない場合は、それぞれnilを渡してやればいい。
インスタンスを作成したら、保存ダイアログにアクセサリビューを設定する。これには、addSaveOptionsAccessoryViewToSavePanel:というメソッドを利用する。
IKSaveOptions.h
- (void)addSaveOptionsAccessoryViewToSavePanel:(NSSavePanel*)savePanel;
このメソッドの使い方は、少し変わっている。まず保存ダイアログを作成し、それをこのメソッドの引数として渡してやるのだ。メソッド内部で、保存ダイアログにアクセサリビューを設定するらしい。
その後、保存ダイアログを表示すれば、保存のためのオプションが追加されている。ユーザが設定した内容は、imageUTTypeとimagePropertiesで取得出来る。
IKSaveOptions.h
- (NSString*)imageUTType;
- (NSDictionary*)imageProperties;
ここまでが、IKSaveOptionsの仕事だ。ユーザの設定をもとにしてファイルの変換を行うのは、Core GraphicsのAPIを使うことになる。
では、保存ダイアログの表示から、フォーマットを指定したファイルの保存までを行うソースコードを紹介しよう。
- (void)saveDocument:(id)sender
{
// 保存ダイアログを取得する
NSSavePanel* savePanel;
savePanel = [NSSavePanel savePanel];
// IKSaveOptionsを作る
IKSaveOptions* saveOptions;
saveOptions = [[IKSaveOptions alloc]
initWithImageProperties:nil imageUTType:nil];
// アクセサリビューを設定する
[saveOptions addSaveOptionsAccessoryViewToSavePanel:savePanel];
// 保存ダイアログを表示する
int result;
result = [savePanel runModal];
if (result != NSOKButton) {
return;
}
// Image destinationを作る
NSURL* url;
CGImageDestinationRef imageDest;
url = [NSURL fileURLWithPath:[savePanel filename]];
imageDest = CGImageDestinationCreateWithURL(
(CFURLRef)url, (CFStringRef)[saveOptions imageUTType], 1, NULL);
if (!imageDest) {
return;
}
// 画像を設定して保存する
CGImageDestinationAddImage(
imageDest,
[_imageView image],
(CFDictionaryRef)[saveOptions imageProperties]);
CGImageDestinationFinalize(imageDest);
CFRelease(imageDest);
}
このようなコードで、フォーマットの変換を行うことが出来る。