カテゴリでNSImageにファイル保存機能を付加する

今回は、前回のリサイズ機能に引き続きObjective-Cのカテゴリの機能を使って、NSImageにファイルへの保存機能を追加します。
サポートするファイル形式としてはTIFFとJPEGとします。

1.概要

NSImageに以下のメソッドを追加します。

// TIFF形式での保存
- (BOOL)saveAsTIFFFile:(NSString *)pstrPath;

// JPEG形式での保存
- (BOOL)saveAsJPEGFile:(NSString *)pstrPath compressionFactor:(float)fCompFactor;

カテゴリの作成については前回の「カテゴリでNSImageにリサイズ機能を付加する」を参照してください。

2.TIFF形式での保存

TIFF形式での保存処理のコードを以下に示します。

- (BOOL)saveAsTIFFFile:(NSString *)pstrPath
{
    NSData               *poTiffData;

    // TIFF形式データ取得
    poTiffData = [self TIFFRepresentation];

    // NSDataのファイル書き込みメソッドで保存
    return [poTiffData writeToFile:pstrPath atomically:YES];
}

処理内容は、NSImage自身がTIFF形式データの生成機能(TIFFRepresentation)を持っていますので、それでTIFF形式のNSDataオブジェクトを生成し、NSDataのwriteToFile:atomically:メソッドでファイルに書き込むといういたってシンプルなものです。

3.JPEG形式での保存

JPEG形式での保存処理のコードを以下に示します。

- (BOOL)saveAsJPEGFile:(NSString *)pstrPath compressionFactor:(float)fCompFactor
{
    NSData              *poTiffData;
    NSData              *poJpegData;
    NSBitmapImageRep    *poBmpImgRep;
    NSDictionary        *pdicCompFactor;

    // NSImage => TIFF => NSBitmapImageRepへ変換
    poTiffData   = [self TIFFRepresentation];
    poBmpImgRep  = [NSBitmapImageRep imageRepWithData:poTiffData];

    // JPEG圧縮率属性の生成
    pdicCompFactor = [NSDictionary dictionaryWithObjectsAndKeys:
                                           [NSNumber numberWithFloat:fCompFactor],
                                           NSImageCompressionFactor,
                                           nil];

    // NSBitmapImageRepの変換機能を利用してJPEG形式に変換
    poJpegData = [poBmpImgRep representationUsingType:NSJPEGFileType
                                           properties:pdicCompFactor];

    // NSDataのファイル書き込みメソッドで保存
    return [poJpegData writeToFile:pstrPath atomically:YES];
}

処理内容は以下の流れになっています。

(1) NSImageのTIFFRepresentationメソッドでTIFF形式のNSDataオブジェクトを取得
(2) 上記で取得したNSDataを元にimageRepWithData:メソッドでNSBitmapImageRepオブジェクトを生成
(3) NSBitmapImageRepのrepresentationUsingType:properties:メソッドでJPEG形式のNSDataオブジェクトを生成
(4) NSDataのwriteToFile:atomically:メソッドでファイルに書き込む

NSBitmapImageRepのrepresentationUsingType:properties:メソッドは、JPEG以外にBMP, GIF, PNGもサポートしていますのでこれらの形式についても同様の処理を追加することで対応することができます。

4.テストアプリケーション

リサイズ用に作成したアプリに保存関連のパラメータ設定項目と保存ボタンを追加しました。


サンプルプログラムのダウンロード(68KB)

【作成・確認環境】
Mac OS X v10.4.2
Xcode v2.0

一覧に戻る