2010年12月18日土曜日

[iOS]画像にEXIFなどのメタデータを付加する方法メモ

iOS4になってから画像のEXIFを読み込んだり書き込んだりすることができるようになりました。

UIImagePickerを利用していればdelegateで呼ばれるメソッドの引数にメタデータが格納されています。
カメラロールに保存する場合は ALAssetsLibrary:writeImageToSavedPhotosAlbum:metadata:completionBlock:
を使えばメタデータも一緒に格納できます。(iOS4.1以上)


ただ、画像のメタデータを直接書き換える方法がよく分からなくてハマってしまいました。
検索してもめぼしい情報があまり見当たらず四苦八苦して実現したので一応メモしておきます。


#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/UTCoreTypes.h>

- (NSData *)addMetadata:(UIImage *)image {
    NSMutableData *imageData = [[[NSMutableData alloc] init] autorelease];

    // メタデータ
    NSMutableDictionary *metadata = [NSMutableDictionary dictionary];

    // メタデータ: 画像の高さと幅
    [metadata setObject:[NSNumber numberWithInt:1000]
                 forKey:(NSString *)kCGImagePropertyPixelHeight];
    [metadata setObject:[NSNumber numberWithInt:1000]
                 forKey:(NSString *)kCGImagePropertyPixelWidth];

    // メタデータ: Exif
    NSMutableDictionary *exif = [NSMutableDictionary dictionary];
    exif = [metadata objectForKey:(NSString *)kCGImagePropertyExifDictionary];
    [exif setObject:@"ユーザーコメント" forKey:(NSString *)kCGImagePropertyExifUserComment];
    [metadata setObject:exif forKey:(NSString *)kCGImagePropertyExifDictionary];


    // CGImageDestination を利用して画像とメタデータをひ関連付ける
    CGImageDestinationRef dest;
    dest = CGImageDestinationCreateWithData((CFMutableDataRef)imageData, kUTTypeJPEG, 1, nil);

    CGImageDestinationAddImage(dest, image.CGImage, (CFDictionaryRef)metadata);
    CGImageDestinationFinalize(dest);
    CFRelease(dest);

    return imageData;
}

0 件のコメント: