Hatena::Groupiphone-dev

Ni chicha, ni limona - 平均から抜けられない僕

2010-10-14

[AssetsLibrary] フォトライブラリの写真にExif情報を付けて保存する 00:40  [AssetsLibrary] フォトライブラリの写真にExif情報を付けて保存する - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  [AssetsLibrary] フォトライブラリの写真にExif情報を付けて保存する - Ni chicha, ni limona - 平均から抜けられない僕  [AssetsLibrary] フォトライブラリの写真にExif情報を付けて保存する - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

iOS4.1から、カメラロールにデータを保存する際に画像のメタデータも一緒に保存できるようになりました。

つまり、iOS3以前ではトリッキーな方法でしか実現できなかったExif情報の付与も、ごく簡単にできるようになったわけです。


具体的には、ALAssetsLibraryクラスのwriteImageToSavedPhotosAlbum:metadata:completionBlock:メソッド、あるいはwriteImageDataToSavedPhotosAlbum:metadata:completionBlock:メソッドを使用します。両者の違いは画像データがCGImageRefか、NSDataかです。


イメージピッカーで選んだ写真を元に、コメントとシャッター速度の2つのExif情報を付けて保存するサンプルコードを以下に記します。

#import <AssetsLibrary/AssetsLibrary.h>
#import <ImageIO/ImageIO.h>

-(IBAction)takeButton:(id)sender {
  UIImagePickerController *picker = [[[UIImagePickerController alloc] init] autorelease];
  picker.sourceType = UIImagePickerControllerSourceTypeCamera;

  picker.delegate = self;
  [self presentModalViewController:picker animated:YES];
}

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {
    NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];

    if (assetURL) {
        ALAssetsLibraryAssetForURLResultBlock resultBlock = ^(ALAsset *asset) {
            ALAssetRepresentation *representation;
            representation = [asset defaultRepresentation];

            // 元から付いているメタデータも残す
            NSMutableDictionary *metadata;
            metadata = [[NSMutableDictionary alloc]
                         initWithDictionary:[representation metadata]];

            // コメント、シャッター速度をExif情報として設定
            NSDictionary *exif = [NSDictionary dictionaryWithObjectsAndKeys:
                                  @"コメント",
                                  (NSString*)kCGImagePropertyExifUserComment,
                                  [NSNumber numberWithFloat:0.125f],
                                  (NSString*)kCGImagePropertyExifExposureTime,
                                  nil];
            [metadata setObject:exif
                         forKey:(NSString*)kCGImagePropertyExifDictionary];

            // カメラロールにメタデータを付けて書き込み
            ALAssetsLibrary* l = [[ALAssetsLibrary alloc] init];
            [l writeImageToSavedPhotosAlbum:[representation fullScreenImage]
                                      metadata:metadata
                            completionBlock:^(NSURL* url, NSError* e){
                                NSLog(@"Saved: %@<%@>", url, e);
                            }];
                            [metadata release];
            [l release];
        };
        
        ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];
        [library assetForURL:assetURL
                 resultBlock:resultBlock
                failureBlock:^(NSError *error) {
                    NSLog(@"error:%@", error);
                }];
    } else { NSLog(@"error"); }
    
    [picker dismissModalViewControllerAnimated:YES];
}

事前にAssets Libraryフレームワークをプロジェクトに追加し、さらにExif情報を文字列リテラルで扱えるImageIOフレームワークも追加するのを忘れないようにお気を付けください。


こうして保存した画像をMac OS X上のプレビューアプリで見れば、Exif情報が付与されていることが分かります。


ちなみにAssets Libraryフレームワークでは、既存の写真を変更したり、削除したりすることはできません。新しいデータをカメラロールに保存できるのみです。

カメラロールくらいは変更・削除を許可してくれてもいいのになあと思いますが・・・。


それにしてもAssets Libraryフレームワークは超便利です。独自のイメージピッカーも自由に作れるようになりますし、ますます便利になりましたね!

参考サイト

イメージピッカーから選んだ写真の、Exif情報を取り出すときのサンプルコード。 @sumihiro さん。

ImageIOフレームワークとCoreGraphicsを使って、バンドル内にExif付きのデータを保存するサンプルコード。 @nakamura001 さん。

wavdevwavdev2011/01/10 09:39iOS4.2から [info objectForKey:UIImagePickerControllerReferenceURL]がNULL返すようになっちゃいましたね。iOS4.1ではOKだったんですが...ちょっと苦戦してます。

ArytimiArytimi2018/02/23 10:52Next Best Thing To Nolvadex <a href=http://tadalaffbuy.com>buy cialis</a> Amitripyline Online

MonlirlMonlirl2018/04/19 15:34want to buy real isotretinoin <a href=http://tadalaffbuy.com>cialis without prescription</a> Le Priligy Generique Comprimes

btaletegysbtaletegys2018/07/31 13:01<a href="http://gigawatt6.com">cialis canada order</a> how to order cialis online http://gigawatt6.com

htaletnmqkhtaletnmqk2018/08/01 10:24<a href="http://baymontelreno.com">generic cialis usa</a> cheapest place to buy cialis http://baymontelreno.com

etaletilcpetaletilcp2018/08/02 08:48<a href="http://bullsac.com">where to buy levitra</a> levitra online overnight delivery http://bullsac.com

rtalethbhdrtalethbhd2018/08/05 14:26<a href="http://livecopys.com">generic viagra for sale</a> viagra coupons http://livecopys.com

dtaletemfsdtaletemfs2018/08/06 07:41<a href="http://baymontelreno.com">cialis online paypal</a> cialis 20mg http://baymontelreno.com

etaletgamletaletgaml2018/08/07 03:34<a href="http://motechautomotive.com">generic cialis</a> generic cialis in canada http://motechautomotive.com

ptaletbrdaptaletbrda2018/08/07 19:26<a href="http://psychologytweets.com">buy cialis online canada</a> buy cialis canada http://psychologytweets.com

gtalethxzngtalethxzn2018/08/08 02:49<a href="http://baymontelreno.com">order cialis using paypal</a> order cialis pills http://baymontelreno.com

etaletmdiuetaletmdiu2018/08/08 13:01<a href="http://missreplicawatches.com">order generic cialis</a> cialis generic price http://missreplicawatches.com

IsakovskayaledIsakovskayaled2018/08/15 15:39only now natural viagra pills

http://buyviagra100mgo.com/ - buy viagra canada
<a href="http://buyviagra100mgo.com/">cheap viagra online</a>

viagra pepsi

ataletheklatalethekl2018/08/18 09:05<a href="http://mphasset.com">viagra professional</a> best generic viagra http://mphasset.com

qtaletprsgqtaletprsg2018/08/18 10:17<a href="http://rabbitinahat.com">generic cialis professional 20 mg</a> generic cialis tadalafil http://rabbitinahat.com

ltaletlokbltaletlokb2018/08/18 14:12<a href="http://bullsac.com">buy generic levitra</a> levitra trial offer http://bullsac.com

vtaletoaarvtaletoaar2018/08/18 15:11<a href="http://gigawatt6.com">cialis online prescription</a> cialis lasts http://gigawatt6.com

ltaleteyxvltaleteyxv2018/08/18 18:19<a href="http://baymontelreno.com">prices for cialis</a> buy generic cialis online http://baymontelreno.com

gtaletyxmegtaletyxme2018/08/18 21:57<a href="http://missreplicawatches.com">black cialis reviews</a> when does the cialis patent expire http://missreplicawatches.com

otaletisxtotaletisxt2018/08/19 01:08<a href="http://missreplicawatches.com">why doesn t cialis work</a> online pharmacy canada cialis http://missreplicawatches.com

ftaletbrqtftaletbrqt2018/08/19 04:21<a href="http://gigawatt6.com">cialis vs viagra cost</a> free cialis http://gigawatt6.com

ptaletorhtptaletorht2018/08/19 05:08<a href="http://bullsac.com">levitra order online</a> how long does levitra 10mg last http://bullsac.com

ftaletkomlftaletkoml2018/08/19 08:03<a href="http://psychologytweets.com">what does cialis feel like</a> cialis eye problems http://psychologytweets.com

ptaletksarptaletksar2018/08/19 10:51<a href="http://missreplicawatches.com">cialis nitroglycerin</a> cialis cheap http://missreplicawatches.com

staletwztkstaletwztk2018/08/19 13:39<a href="http://psychologytweets.com">is cialis for women</a> cialis how to use http://psychologytweets.com

ktaletvstmktaletvstm2018/08/19 15:42<a href="http://bullsac.com">online levitra</a> free levitra trial offer http://bullsac.com

qtaletgmzpqtaletgmzp2018/08/19 18:29<a href="http://missreplicawatches.com">cialis 20 mg recommended dosage</a> cialis substitute http://missreplicawatches.com

utaletnjqeutaletnjqe2018/08/20 00:23<a href="http://psychologytweets.com">daily cialis vs regular cialis</a> how long does 5mg cialis last http://psychologytweets.com

ltaletuasultaletuasu2018/08/20 03:19<a href="http://missreplicawatches.com">free cialis coupon</a> how long does it take cialis to start working http://missreplicawatches.com

ttaletnvpzttaletnvpz2018/08/20 04:06<a href="http://bakerssign.com">levitra free trial voucher</a> levitra lowest price http://bakerssign.com

staletuutkstaletuutk2018/08/20 10:08<a href="http://psychologytweets.com">why does cialis not work</a> cialis order online http://psychologytweets.com