フォーマット変換のオプション指定

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);
}

このようなコードで、フォーマットの変換を行うことが出来る。