yidev第七回勉強会:「assets library手習い」発表資料
DESCRIPTION
2010年12月11日の横浜で行われたyidev第七回勉強会のスライドです。 Assets Library、便利ですよ!TRANSCRIPT
![Page 1: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/1.jpg)
Assets Library 手習い
KatokichiSoft
![Page 2: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/2.jpg)
自己紹介
KatokichiSoft
Site : http://cielo.rojo.jp
Twitter : @hkato193
開発アプリ: 「 Metronome PRO」
![Page 3: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/3.jpg)
Assets Library とは
• iOS4.0 から追加されたフレームワークo AssetsLibrary.framework
• 「写真 (Photos) 」アプリで管理している画像 / ビデオにアクセスする手段を提供してくれます
![Page 4: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/4.jpg)
Assets Library を使うとこんなことが
• カメラロールやフォトライブラリのデータに直接アクセスできるo マイイメージピッカー!o お仕着せのあのイメージピッカー要らず!
• 必要なデータを必要なだけ得られますo メモリに優しい!
• メタデータにも簡単アクセスできますo アドホックなコード要らず!
![Page 5: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/5.jpg)
参考資料
残念ながらまだ少ないです
• WWDC2010 Session421 - Incorporating the Camera and Photo Library in your Appo 9:30 〜o サンプルプロジェクト iOS/MyImagePicker/
![Page 6: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/6.jpg)
「アセット」ってなに?
![Page 7: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/7.jpg)
アセットってなに?
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手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/8.jpg)
アセットってなに?
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手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/9.jpg)
アセットってなに?
• 同じ意味を持ったデータのまとまりを扱う単位(資産)o ファイル形式( JPEG, RAW, etc )o サムネイル画像とビデオデータo ファイル名ではなく URL で特定
• アセットを介してデータを取り扱う(情報提供者)
データ∈アセット。アセット == データ、ではないです
![Page 10: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/10.jpg)
登場人物(クラス編)
クラスの階層関係。それぞれ何を区別しているかに注目。
クラス 役割
ALAssetsLibrary フォトライブラリにアクセスするときの起点
ALAssetsGroup イベント。「最近の 12 ヶ月」「美味しかったマツタケ」「高倉健」など
ALAsset アセットそのもの。画像やビデオ
ALAssetRepresentation 画像データ
![Page 11: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/11.jpg)
登場人物(使用技術編)
• 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手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/12.jpg)
3つの利用方法
![Page 13: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/13.jpg)
• 1. 写真のデータに辿り着こうo イメージピッカーと同じようにトップダウンでデータに辿り着く方法です
• 2. イメージピッカーと連携しようo イメージピッカーで選んだ写真からアセットを割り出し
ます
• 3. Exif 情報を操作しようo 画像データをメタデータと共に保存します
こんなことを紹介します
![Page 14: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/14.jpg)
1. 写真のデータに辿り着こう!
手順:1. ALAssetsLibrary から ALAssetsGroup を取得
• (グループのポスター画像を取得) •
– ALAssetsGroup から ALAsset を取得• (フィルターで写真/ビデオを指定)• (アセットのサムネイルを取得)•
– ALAsset から ALAssetRepresentation を取得• (サイズ、ヘッダ情報などのメタデータを取得)•
– ALAssetRepresentation から CGImageRef ( or ビデオ)を取得
![Page 15: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/15.jpg)
写真のデータに辿り着こう!
【 ALAssetsLibrary から ALAssetsGroup を取得 (1)】
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) { if (group) { // グループを配列に格納するなど else // グループ数え上げの終了。データ表示など }; }
ALAssetsGroup が途切れるまで数え上げ
![Page 16: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/16.jpg)
写真のデータに辿り着こう!
【 ALAssetsLibrary から ALAssetsGroup を取得 (2)】
数え上げの実行。グループのタイプを絞り込んでいることに注目NSUInteger groupTypes = ALAssetsGroupAlbum | ALAssetsGroupEvent | ALAssetsGroupFaces;[assetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:listGroupBlock failureBlock:^(NSError *error){NSLog(@"error:%@",error);}];
![Page 17: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/17.jpg)
写真のデータに辿り着こう!
グループの代表になる画像は posterImage メソッドで取得できます。 • iPhone3GS だと 55×55 か 132×132 の画像(ルール不明)• iPhone4 は、すみません、未確認です
CGImageRef posterImageRef = [group posterImage];UIImage *posterImage = [UIImage imageWithCGImage:posterImageRef];
![Page 18: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/18.jpg)
写真のデータに辿り着こう!
【 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手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/19.jpg)
写真のデータに辿り着こう!
選択肢は 3 つ• allAssets : デフォルトフィルター無し
• allPhotos : 写真だけ• allVideos : ビデオだけ
ALAssetFilter *filter = [ALAssetsFilter allPhotos];
[group setAssetsFilter:filter];
[group enumerateAssetsUsingBlock: assetsEnumerationBlock];
グループ内の ALAssets をとりだすとき、フィルタが使えます。
![Page 20: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/20.jpg)
写真のデータに辿り着こう!
【 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手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/21.jpg)
写真のデータに辿り着こう!
サムネイル画像は ALAsset の thumbnail メソッドを使います。 ALAssetsGroupクラスの posterImage メソッドと同様、デバイスに適した解像度の画像がえられます得られます。
CGImageRef thumbnailImageRef = [asset thumbnail];UIImage *thumbnailImage = [UIImage imageWithCGImage:thumbnailImageRef];
![Page 22: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/22.jpg)
写真のデータに辿り着こう!
【 ALAssetRepresentation からデータを取得】
CGImageRef imageRef = [assetRepr fullScreenImage]; UIImage *fullScreenImage = [UIImage imageWithCGImage:imageRef scale:[assetRepresentation scale] orientation:[assetRepresentation orientation]];
他にも fullResolutionImage があります。
![Page 23: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/23.jpg)
写真のデータに辿り着こう!
デモ
![Page 24: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/24.jpg)
2. イメージピッカーと連携しよう!
何ができる?• イメージピッカーで選んだ写真をキーにして ALAsset オブ
ジェクトを取り出せますo さっきとは逆方向
![Page 25: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/25.jpg)
イメージピッカーと連携しよう!
どんなときに便利?• 従来からのアップデートなので UI を変更したくない
• 別の Representation にアクセスしたい
• (自前でイメージピッカーを作るのが面倒くさい)
![Page 26: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/26.jpg)
イメージピッカーと連携しよう!
// イメージピッカーで写真を選択したあとのデリゲートメソッド- (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手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/27.jpg)
(ただし iOS4.1以降をお使いのお客様に限ります)
![Page 28: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/28.jpg)
3. Exif 情報を操作しよう!
何ができる?• 画像データを ALAssetsLibrary で保存できます• メタデータ付きで保存できます
![Page 29: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/29.jpg)
Exif 情報を操作しよう!
どんなときに便利?• カメラロールにイメージデータを保存できます• メタデータ付きで保存できます
o Exif 情報も!
![Page 30: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/30.jpg)
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手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/31.jpg)
(ただし iOS4.1以降をお使いのお客様に限ります)
![Page 32: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/32.jpg)
よくある質問
• フォトライブラリ内のデータを書き換えることはできますか?
• CGImageRef ではなく生の、生のデータがほしいです
• ALAssetRepresentation の url は変化することがあるのでしょうか?
![Page 33: yidev第七回勉強会:「Assets Library手習い」発表資料](https://reader035.vdocuments.pub/reader035/viewer/2022062319/556a55e8d8b42a7a138b4a99/html5/thumbnails/33.jpg)
Assets Library を使うときの
• URL を永続的に保持しないようにしましょう
• アプリをマルチタスキングで動かす場合、通知「 ALAssetsLibraryChangedNotification 」をキチンと受け取りましょう
• アセットのデータは非同期で受け取るものとしてアプリを設計しましょう