yidev第七回勉強会:「assets library手習い」発表資料

33
Assets Library 手手手 KatokichiSoft

Upload: katokichisoft-in-japan

Post on 31-May-2015

15.045 views

Category:

Technology


7 download

DESCRIPTION

2010年12月11日の横浜で行われたyidev第七回勉強会のスライドです。 Assets Library、便利ですよ!

TRANSCRIPT

Page 1: yidev第七回勉強会:「Assets Library手習い」発表資料

Assets Library 手習い

KatokichiSoft

Page 2: yidev第七回勉強会:「Assets Library手習い」発表資料

自己紹介

KatokichiSoft

  Site : http://cielo.rojo.jp

  Twitter :     @hkato193

 開発アプリ:   「 Metronome PRO」

Page 3: yidev第七回勉強会:「Assets Library手習い」発表資料

Assets Library とは

• iOS4.0 から追加されたフレームワークo AssetsLibrary.framework

• 「写真 (Photos) 」アプリで管理している画像 / ビデオにアクセスする手段を提供してくれます

Page 4: yidev第七回勉強会:「Assets Library手習い」発表資料

Assets Library を使うとこんなことが

• カメラロールやフォトライブラリのデータに直接アクセスできるo マイイメージピッカー!o お仕着せのあのイメージピッカー要らず!

• 必要なデータを必要なだけ得られますo メモリに優しい!

• メタデータにも簡単アクセスできますo アドホックなコード要らず!

Page 5: yidev第七回勉強会:「Assets Library手習い」発表資料

参考資料

残念ながらまだ少ないです

• WWDC2010 Session421 - Incorporating the Camera and Photo Library in your Appo 9:30 〜o サンプルプロジェクト iOS/MyImagePicker/

Page 6: yidev第七回勉強会:「Assets Library手習い」発表資料

「アセット」ってなに?

Page 7: yidev第七回勉強会:「Assets Library手習い」発表資料

アセットってなに?

asset/ǽset/ 名 詞 1  (…にとって)役にたつもの[こと] , 価値あるもの⦅ to, for ... ⦆;長所 , 美点(⇔ liability ) an asset in negotiation |交渉の際にプラスになるもの count beauty as an asset |美しいことを利点と心得る He is a most valuable asset to the firm. |彼は会社にとって貴重な人材だ .2  資産の一項目 , ( 1 個の)財産 .3 ⦅〜 s ⦆① 流動資産;資産 , 財産 fixed [ intangible, net ] assets |固定[無形 ,  純]財産 cultural assets |文化財 seize [ take over ] the assets of ... |…の財産を接収する .②  (債務弁済に充当される)財産 .③  (特に負債資本に対し)資産[財産]項目 . ⇒ PROPERTY[類語]④ 〘法律〙(死者の債務遺贈に充当されるべき)遺産 .4  情報提供者 .

プログレッシブ英和・和英中辞典

Page 8: yidev第七回勉強会:「Assets Library手習い」発表資料

アセットってなに?

asset/ǽset/ 名 詞 1  (…にとって)役にたつもの[こと] , 価値あるもの⦅ to, for ... ⦆;長所 , 美点(⇔ liability ) an asset in negotiation |交渉の際にプラスになるもの count beauty as an asset |美しいことを利点と心得る He is a most valuable asset to the firm. |彼は会社にとって貴重な人材だ .2  資産の一項目 , ( 1 個の)財産 .3 ⦅〜 s ⦆① 流動資産;資産 , 財産 fixed [ intangible, net ] assets |固定[無形 ,  純]財産 cultural assets |文化財 seize [ take over ] the assets of ... |…の財産を接収する .②  (債務弁済に充当される)財産 .③  (特に負債資本に対し)資産[財産]項目 . ⇒ PROPERTY[類語]④ 〘法律〙(死者の債務遺贈に充当されるべき)遺産 .4  情報提供者 .

−−− プログレッシブ英和・和英中辞典から抜粋

Page 9: yidev第七回勉強会:「Assets Library手習い」発表資料

アセットってなに?

• 同じ意味を持ったデータのまとまりを扱う単位(資産)o ファイル形式( JPEG, RAW, etc )o サムネイル画像とビデオデータo ファイル名ではなく URL で特定

• アセットを介してデータを取り扱う(情報提供者)

データ∈アセット。アセット == データ、ではないです

Page 10: yidev第七回勉強会:「Assets Library手習い」発表資料

登場人物(クラス編)

クラスの階層関係。それぞれ何を区別しているかに注目。

クラス 役割

ALAssetsLibrary フォトライブラリにアクセスするときの起点

ALAssetsGroup イベント。「最近の 12 ヶ月」「美味しかったマツタケ」「高倉健」など

ALAsset アセットそのもの。画像やビデオ

ALAssetRepresentation 画像データ

Page 11: yidev第七回勉強会:「Assets Library手習い」発表資料

登場人物(使用技術編)

• Proxy デザインパターンo データには代理を介してアクセスします

• Blockso iOS4.0 で使えるようになった構文です。ラムダ / クロージャ

• UTI ( Uniform Type Identifier )o データ種類の識別子。 "public.jpeg" や "com.apple.quicktime-

movie" とか

• URLo データの場所。 "assets-library://asset/asset.jpg?

id=3224&ext=jpg"みたく使われます

Page 12: yidev第七回勉強会:「Assets Library手習い」発表資料

3つの利用方法

Page 13: yidev第七回勉強会:「Assets Library手習い」発表資料

• 1. 写真のデータに辿り着こうo イメージピッカーと同じようにトップダウンでデータに辿り着く方法です

• 2. イメージピッカーと連携しようo イメージピッカーで選んだ写真からアセットを割り出し

ます

• 3. Exif 情報を操作しようo 画像データをメタデータと共に保存します

こんなことを紹介します

Page 14: yidev第七回勉強会:「Assets Library手習い」発表資料

1. 写真のデータに辿り着こう!

手順:1. ALAssetsLibrary から ALAssetsGroup を取得

• (グループのポスター画像を取得) •  

– ALAssetsGroup から ALAsset を取得• (フィルターで写真/ビデオを指定)• (アセットのサムネイルを取得)•  

– ALAsset から ALAssetRepresentation を取得• (サイズ、ヘッダ情報などのメタデータを取得)•  

– ALAssetRepresentation から CGImageRef ( or ビデオ)を取得

Page 15: yidev第七回勉強会:「Assets Library手習い」発表資料

写真のデータに辿り着こう!

【 ALAssetsLibrary から ALAssetsGroup を取得 (1)】

ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];

ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock =     ^(ALAssetsGroup *group, BOOL *stop) {        if (group) {           // グループを配列に格納するなど else           // グループ数え上げの終了。データ表示など };    }

ALAssetsGroup が途切れるまで数え上げ

Page 16: yidev第七回勉強会:「Assets Library手習い」発表資料

写真のデータに辿り着こう!

【 ALAssetsLibrary から ALAssetsGroup を取得 (2)】

数え上げの実行。グループのタイプを絞り込んでいることに注目NSUInteger groupTypes = ALAssetsGroupAlbum |                        ALAssetsGroupEvent |                        ALAssetsGroupFaces;[assetsLibrary enumerateGroupsWithTypes:groupTypes    usingBlock:listGroupBlock    failureBlock:^(NSError *error){NSLog(@"error:%@",error);}];

Page 17: yidev第七回勉強会:「Assets Library手習い」発表資料

写真のデータに辿り着こう!

グループの代表になる画像は posterImage メソッドで取得できます。 • iPhone3GS だと 55×55 か 132×132 の画像(ルール不明)• iPhone4 は、すみません、未確認です

CGImageRef posterImageRef = [group posterImage];UIImage *posterImage =    [UIImage imageWithCGImage:posterImageRef];

Page 18: yidev第七回勉強会:「Assets Library手習い」発表資料

写真のデータに辿り着こう!

【 ALAssetsGroup から ALAsset を取得】

// グループ名は [assetsGroup valueForProperty:ALAssetsGroupPropertyName];ALAssetsGroupEnumerationResultsBlock assetsEnumerationBlock =    ^(ALAsset *result, NSUInteger index, BOOL *stop) {        if (result) {            // Asset の取得成功 NSLog(@"asset:%@", result);        }    };

[assetsGroup enumerateAssetsUsingBlock:assetsEnumerationBlock];

ALAsset が途切れるまで数え上げ

最後は nil がやってくることに注意!!

Page 19: yidev第七回勉強会:「Assets Library手習い」発表資料

写真のデータに辿り着こう!

選択肢は 3 つ• allAssets : デフォルトフィルター無し

• allPhotos : 写真だけ• allVideos : ビデオだけ

ALAssetFilter *filter  = [ALAssetsFilter allPhotos];

[group   setAssetsFilter:filter];

[group     enumerateAssetsUsingBlock:        assetsEnumerationBlock];

グループ内の ALAssets をとりだすとき、フィルタが使えます。

Page 20: yidev第七回勉強会:「Assets Library手習い」発表資料

写真のデータに辿り着こう!

【 ALAsset から ALAssetRepresentation を取得】

NSArray *utis;utis = [asset valueForProperty:ALAssetPropertyRepresentations];

ALAssetRepresentation *assetRepresentation =    [asset defaultRepresentation];

ALAsset が持っている Representation の一覧を取得

お手軽な Representation の取得方法(大抵はこれで OK )

ALAssetRepresentation *assetRepresentation =    [asset representationForUTI:@"public.jpeg"];

JPEG 画像の Representation を取得

Page 21: yidev第七回勉強会:「Assets Library手習い」発表資料

写真のデータに辿り着こう!

サムネイル画像は ALAsset の thumbnail メソッドを使います。 ALAssetsGroupクラスの posterImage メソッドと同様、デバイスに適した解像度の画像がえられます得られます。

CGImageRef thumbnailImageRef = [asset thumbnail];UIImage *thumbnailImage =    [UIImage imageWithCGImage:thumbnailImageRef];

Page 22: yidev第七回勉強会:「Assets Library手習い」発表資料

写真のデータに辿り着こう!

【 ALAssetRepresentation からデータを取得】

CGImageRef imageRef = [assetRepr fullScreenImage]; UIImage *fullScreenImage =  [UIImage imageWithCGImage:imageRef              scale:[assetRepresentation scale]        orientation:[assetRepresentation orientation]];

他にも fullResolutionImage があります。

Page 23: yidev第七回勉強会:「Assets Library手習い」発表資料

写真のデータに辿り着こう!

デモ

Page 24: yidev第七回勉強会:「Assets Library手習い」発表資料

2. イメージピッカーと連携しよう!

何ができる?• イメージピッカーで選んだ写真をキーにして ALAsset オブ

ジェクトを取り出せますo さっきとは逆方向

Page 25: yidev第七回勉強会:「Assets Library手習い」発表資料

イメージピッカーと連携しよう!

どんなときに便利?• 従来からのアップデートなので UI を変更したくない

• 別の Representation にアクセスしたい

• (自前でイメージピッカーを作るのが面倒くさい)

Page 26: yidev第七回勉強会:「Assets Library手習い」発表資料

イメージピッカーと連携しよう!

// イメージピッカーで写真を選択したあとのデリゲートメソッド- (void)imagePickerController:(UIImagePickerController *)pickerdidFinishPickingMediaWithInfo:(NSDictionary *)info {    // 得られた情報から ALAsset の URL を取得    NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];    ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];    // URL に対応するアセットを特定し、そのアセットに対して処理を行う    [library assetForURL:assetURL             resultBlock:^(ALAsset *asset) {                 // 目的のアセットを特定完了                 // メタデータにアクセスしたり、                 // 別の Representation を取り出したりできる                 NSLog(@"asset:%@", asset);             }            failureBlock:^(NSError *error) { NSLog(@"error:%@", error); }];}

Page 27: yidev第七回勉強会:「Assets Library手習い」発表資料

(ただし iOS4.1以降をお使いのお客様に限ります)

Page 28: yidev第七回勉強会:「Assets Library手習い」発表資料

3. Exif 情報を操作しよう!

何ができる?• 画像データを ALAssetsLibrary で保存できます• メタデータ付きで保存できます

Page 29: yidev第七回勉強会:「Assets Library手習い」発表資料

Exif 情報を操作しよう!

どんなときに便利?• カメラロールにイメージデータを保存できます• メタデータ付きで保存できます

o Exif 情報も!

Page 30: yidev第七回勉強会:「Assets Library手習い」発表資料

Exif 情報を操作しよう!

// カメラロールにメタデータを付けて書き込みNSDictionary* metadata = [representation metadata];ALAssetsLibrary* l = [[ALAssetsLibrary alloc] init]; [l writeImageToSavedPhotosAlbum:[representation fullScreenImage]                       metadata:metadatacompletionBlock:^(NSURL* url, NSError* e){               // 書き込み完了                                                NSLog(@"Saved: %@<%@>", url, e);                 }];[metadata release];[l release];

Page 31: yidev第七回勉強会:「Assets Library手習い」発表資料

(ただし iOS4.1以降をお使いのお客様に限ります)

Page 32: yidev第七回勉強会:「Assets Library手習い」発表資料

よくある質問

• フォトライブラリ内のデータを書き換えることはできますか?

• CGImageRef ではなく生の、生のデータがほしいです

• ALAssetRepresentation の url は変化することがあるのでしょうか?

Page 33: yidev第七回勉強会:「Assets Library手習い」発表資料

Assets Library を使うときの

• URL を永続的に保持しないようにしましょう

• アプリをマルチタスキングで動かす場合、通知「 ALAssetsLibraryChangedNotification 」をキチンと受け取りましょう

• アセットのデータは非同期で受け取るものとしてアプリを設計しましょう