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

15,940 views

Published on

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

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
15,940
On SlideShare
0
From Embeds
0
Number of Embeds
60
Actions
Shares
0
Downloads
32
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide
  • ・データに直接アクセスできるので、イメージピッカーのような手作業を介さなくてすむのもポイントです。たとえば画像処理アプリなどのテストデータを iPhoto で管理しておいて、ユニットテストに使用するみたいなこともできます。 ・必要になるまで画像データ、つまりメモリを消費するデータを引っ張り出さないのです。後述する ALAsset や ALAssetRepresentation といった virtual proxy パターンにおける Proxy オブジェクトが、代わってくれます。 ・画像ヘッダ部分のパースやメンテナンスなど、細かい部分の処理を Assets Library フレームワークが代行してくれますので、
  • 1 対多の関係にtt
  • この辺の技術を覚えておけば大丈夫です。 Proxy は幾つかある中の virtual proxy パターン Blocks は匿名関数とかとも言います。 URL は、 http://www.example.com/hoge.h と同じです。 Assets Library
  • シミュレータが iPhone(Retina) で試したときに、アクセスに失敗していて、時間がありませんでした(言い訳)
  • set したあとはずっと効いているので注意
  • なお、これらの UTI は、いずれも MobileCoreServices.framework に含まれているヘッダファイル UTCoreTypes.h で、文字列リテラルとして定義されています。 したがって、文字列 @"public.jpeg" を直接使用するのではなく、 MobileCoreServices.framework を追加した上で、文字列リテラル kUTTypeJPEG を使用するのが良いでしょう。
  • 基本はイメージピッカーと同じサイズのデータが得られるのみですので、過剰な期待は禁物です。
  • ・ RootViewController.m   ALAssetsLibrary->ALAssetsGroup の数え上げ   ( viewDidLoad )数え上げた Group を突っ込んでいる ・ AlbumContentsViewController.m   ALAssetsGroup->ALAsset の取り出し   ( viewWillAppear: )数え上げた ALAsset オブジェクトを、いったん全て NSMutableArray に突っ込んでいる    proxy パターンだからこそできる配列へのぜんつっ   ALAssetsFilter   写真だけを対象にして数え上げ AlbumContentsTableViewCell.m ・ PhotoDisplayViewController.m   ALAsset->ALAssetRepresentation の取り出し  画像データの取得 TapDetectingImageView.m ThumbnailImageView.m
  • NSData を保存したい場合は writeImageDataToSavedPhotosAlbum:metadata:completionBlock: メソッドをを
  • ・書き換えは出来ません。既存データを読むことはできるものの、保存は新しいファイルに対してのみ行えるので、コピーをカメラロールに保存するしかありません ・ ALAsstRepresentation クラスの RepregetBytes:fromOffset:length:error: を使用すれば生データを取得できます。 ・あります。具体的には、 - サスペンドしているときにカメラで撮影したりすると、新しいデータが登録されます。このときに URL が変化する可能性があrあr
  • yidev第七回勉強会:「Assets Library手習い」発表資料

    1. 1. Assets Library 手習い KatokichiSoft
    2. 2. 自己紹介 <ul><li>KatokichiSoft </li></ul><ul><li>  Site : http://cielo.rojo.jp </li></ul><ul><li>  Twitter : </li></ul><ul><li>     @hkato193 </li></ul><ul><li> 開発アプリ: </li></ul><ul><li>   「 Metronome PRO 」 </li></ul>
    3. 3. Assets Library とは <ul><ul><li>iOS4.0 から追加されたフレームワーク </li></ul></ul><ul><ul><ul><li>AssetsLibrary.framework </li></ul></ul></ul><ul><ul><li>「写真 (Photos) 」アプリで管理している画像 / ビデオにアクセスする手段を提供してくれます </li></ul></ul>
    4. 4. Assets Library を使うとこんなことが <ul><ul><li>カメラロールやフォトライブラリのデータに直接アクセスできる </li></ul></ul><ul><ul><ul><li>マイイメージピッカー! </li></ul></ul></ul><ul><ul><ul><li>お仕着せのあのイメージピッカー要らず! </li></ul></ul></ul><ul><ul><li>必要なデータを必要なだけ得られます </li></ul></ul><ul><ul><ul><li>メモリに優しい! </li></ul></ul></ul><ul><ul><li>メタデータにも簡単アクセスできます </li></ul></ul><ul><ul><ul><li>アドホックなコード要らず! </li></ul></ul></ul>
    5. 5. 参考資料 <ul><li>残念ながらまだ少ないです </li></ul><ul><ul><li>WWDC2010 Session421 - Incorporating the Camera and Photo Library in your App </li></ul></ul><ul><ul><ul><li>9:30 〜 </li></ul></ul></ul><ul><ul><ul><li>サンプルプロジェクト iOS/MyImagePicker/ </li></ul></ul></ul>
    6. 6. 「アセット」ってなに?
    7. 7. アセットってなに? <ul><li>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   情報提供者 . </li></ul>  プログレッシブ英和・和英中辞典
    8. 8. アセットってなに? <ul><li>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   情報提供者 . </li></ul> −−− プログレッシブ英和・和英中辞典から抜粋
    9. 9. アセットってなに? <ul><ul><li>同じ意味を持ったデータのまとまりを扱う単位(資産) </li></ul></ul><ul><ul><ul><li>ファイル形式( JPEG, RAW, etc ) </li></ul></ul></ul><ul><ul><ul><li>サムネイル画像とビデオデータ </li></ul></ul></ul><ul><ul><ul><li>ファイル名ではなく URL で特定 </li></ul></ul></ul><ul><ul><li>アセットを介してデータを取り扱う(情報提供者) </li></ul></ul><ul><li>データ∈アセット。アセット == データ、ではないです </li></ul>
    10. 10. 登場人物(クラス編) <ul><li>クラスの階層関係。それぞれ何を区別しているかに注目。 </li></ul>クラス 役割 ALAssetsLibrary フォトライブラリにアクセスするときの起点 ALAssetsGroup イベント。「最近の 12 ヶ月」「美味しかったマツタケ」「高倉健」など ALAsset アセットそのもの。画像やビデオ ALAssetRepresentation 画像データ
    11. 11. 登場人物(使用技術編) <ul><ul><li>Proxy デザインパターン </li></ul></ul><ul><ul><ul><li>データには代理を介してアクセスします </li></ul></ul></ul><ul><ul><li>Blocks </li></ul></ul><ul><ul><ul><li>iOS4.0 で使えるようになった構文です。ラムダ / クロージャ </li></ul></ul></ul><ul><ul><li>UTI ( Uniform Type Identifier ) </li></ul></ul><ul><ul><ul><li>データ種類の識別子。 &quot;public.jpeg&quot; や &quot;com.apple.quicktime-movie&quot; とか </li></ul></ul></ul><ul><ul><li>URL </li></ul></ul><ul><ul><ul><li>データの場所。 &quot;assets-library://asset/asset.jpg?id=3224&ext=jpg&quot; みたく使われます </li></ul></ul></ul>
    12. 12. 3つの利用方法
    13. 13. <ul><ul><li>1. 写真のデータに辿り着こう </li></ul></ul><ul><ul><ul><li>イメージピッカーと同じようにトップダウンでデータに辿り着く方法です </li></ul></ul></ul><ul><ul><li>2. イメージピッカーと連携しよう </li></ul></ul><ul><ul><ul><li>イメージピッカーで選んだ写真からアセットを割り出します </li></ul></ul></ul><ul><ul><li>3. Exif 情報を操作しよう </li></ul></ul><ul><ul><ul><li>画像データをメタデータと共に保存します </li></ul></ul></ul>こんなことを紹介します
    14. 14. 1. 写真のデータに辿り着こう! <ul><li>手順: </li></ul><ul><ul><li>ALAssetsLibrary から ALAssetsGroup を取得 </li></ul></ul><ul><ul><ul><li>(グループのポスター画像を取得) </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><li>ALAssetsGroup から ALAsset を取得 </li></ul></ul><ul><ul><ul><li>(フィルターで写真/ビデオを指定) </li></ul></ul></ul><ul><ul><ul><li>(アセットのサムネイルを取得) </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><li>ALAsset から ALAssetRepresentation を取得 </li></ul></ul><ul><ul><ul><li>(サイズ、ヘッダ情報などのメタデータを取得) </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><li>ALAssetRepresentation から CGImageRef ( or ビデオ)を取得 </li></ul></ul>
    15. 15. 写真のデータに辿り着こう! <ul><li>【 ALAssetsLibrary から ALAssetsGroup を取得 (1) 】 </li></ul>ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock =      ^(ALAssetsGroup *group, BOOL *stop) {         if (group) {            // グループを配列に格納するなど         else            // グループ数え上げの終了。データ表示など         };     } ALAssetsGroup が 途切れるまで 数え上げ
    16. 16. 写真のデータに辿り着こう! <ul><li>【 ALAssetsLibrary から ALAssetsGroup を取得 (2) 】 </li></ul>数え上げの実行。グループのタイプを絞り込んでいることに注目 NSUInteger groupTypes = ALAssetsGroupAlbum |                         ALAssetsGroupEvent |                         ALAssetsGroupFaces ; [assetsLibrary enumerateGroupsWithTypes :groupTypes     usingBlock :listGroupBlock     failureBlock :^(NSError *error){NSLog(@&quot;error:%@&quot;,error);}];
    17. 17. 写真のデータに辿り着こう! <ul><li>グループの代表になる画像は posterImage メソッドで取得できます。 </li></ul><ul><li>  </li></ul><ul><ul><li>iPhone3GS だと 55×55 か 132×132 の画像(ルール不明) </li></ul></ul><ul><ul><li>iPhone4 は、すみません、未確認です </li></ul></ul>CGImageRef posterImageRef = [group  posterImage ]; UIImage *posterImage =      [ UIImage imageWithCGImage :posterImageRef];
    18. 18. 写真のデータに辿り着こう! <ul><li>【 ALAssetsGroup から ALAsset を取得】 </li></ul>// グループ名は [assetsGroup valueForProperty:ALAssetsGroupPropertyName]; ALAssetsGroupEnumerationResultsBlock assetsEnumerationBlock =     ^(ALAsset *result, NSUInteger index, BOOL *stop) {         if (result) {             // Asset の取得成功             NSLog(@&quot;asset:%@&quot;, result);         }     }; [assetsGroup enumerateAssetsUsingBlock :assetsEnumerationBlock]; ALAsset が 途切れるまで 数え上げ 最後は nil がやってくることに注意!!
    19. 19. 写真のデータに辿り着こう! <ul><li>選択肢は 3 つ </li></ul><ul><ul><li>allAssets : デフォルトフィルター無し </li></ul></ul><ul><ul><li>allPhotos : 写真だけ </li></ul></ul><ul><ul><li>allVideos : ビデオだけ </li></ul></ul><ul><li>ALAssetFilter *filter  </li></ul><ul><li>  = [ALAssetsFilter allPhotos]; </li></ul><ul><li>[ group   </li></ul><ul><li>   setAssetsFilter :filter]; </li></ul><ul><li>[ group   </li></ul><ul><li>     enumerateAssetsUsingBlock: </li></ul><ul><li>         assetsEnumerationBlock]; </li></ul>グループ内の ALAssets をとりだすとき、フィルタが使えます。
    20. 20. 写真のデータに辿り着こう! <ul><li>【 ALAsset から ALAssetRepresentation を取得】 </li></ul>NSArray *utis; utis = [asset valueForProperty: ALAssetPropertyRepresentations ]; ALAssetRepresentation *assetRepresentation =      [asset defaultRepresentation ]; ALAsset が持っている Representation の一覧を取得 お手軽な Representation の取得方法(大抵はこれで OK ) ALAssetRepresentation *assetRepresentation =      [asset representationForUTI :@&quot;public.jpeg&quot;]; JPEG 画像の Representation を取得
    21. 21. 写真のデータに辿り着こう! <ul><li>サムネイル画像は ALAsset の thumbnail メソッドを使います。 ALAssetsGroup クラスの posterImage メソッドと同様、デバイスに適した解像度の画像がえられます得られます。 </li></ul>CGImageRef thumbnailImageRef = [asset thumbnail ]; UIImage *thumbnailImage =      [ UIImage imageWithCGImage :thumbnailImageRef];
    22. 22. 写真のデータに辿り着こう! <ul><li>【 ALAssetRepresentation からデータを取得】 </li></ul>CGImageRef imageRef = [assetRepr fullScreenImage ];   UIImage *fullScreenImage =   [UIImage imageWithCGImage:imageRef               scale:[assetRepresentation scale]         orientation:[assetRepresentation orientation]]; 他にも fullResolutionImage があります。
    23. 23. 写真のデータに辿り着こう! <ul><li>デモ </li></ul>
    24. 24. 2. イメージピッカーと連携しよう! <ul><li>何ができる? </li></ul><ul><ul><li>イメージピッカーで選んだ写真をキーにして ALAsset オブジェクトを取り出せます </li></ul></ul><ul><ul><ul><li>さっきとは逆方向 </li></ul></ul></ul>
    25. 25. イメージピッカーと連携しよう! <ul><li>どんなときに便利? </li></ul><ul><ul><li>従来からのアップデートなので UI を変更したくない </li></ul></ul><ul><ul><li>別の Representation にアクセスしたい </li></ul></ul><ul><ul><li>(自前でイメージピッカーを作るのが面倒くさい) </li></ul></ul>
    26. 26. イメージピッカーと連携しよう! <ul><li>// イメージピッカーで写真を選択したあとのデリゲートメソッド </li></ul><ul><li>- ( void )imagePickerController:( UIImagePickerController *)picker </li></ul><ul><li>didFinishPickingMediaWithInfo:( NSDictionary *)info { </li></ul><ul><li>    // 得られた情報から ALAsset の URL を取得 </li></ul><ul><li>    NSURL *assetURL = [info objectForKey : UIImagePickerControllerReferenceURL ]; </li></ul><ul><li>    ALAssetsLibrary *library = [[[ALAssetsLibrary alloc ] init ] autorelease ]; </li></ul><ul><li>    // URL に対応するアセットを特定し、そのアセットに対して処理を行う </li></ul><ul><li>    [library assetForURL :assetURL </li></ul><ul><li>             resultBlock :^(ALAsset *asset) { </li></ul><ul><li>                 // 目的のアセットを特定完了 </li></ul><ul><li>                 // メタデータにアクセスしたり、 </li></ul><ul><li>                 // 別の Representation を取り出したりできる </li></ul><ul><li>                 NSLog ( @&quot;asset:%@&quot; , asset); </li></ul><ul><li>             } </li></ul><ul><li>            failureBlock :^( NSError *error) { NSLog ( @&quot;error:%@&quot; , error); }]; </li></ul><ul><li>} </li></ul>
    27. 27. (ただし iOS4.1 以降をお使いのお客様に限ります)
    28. 28. 3. Exif 情報を操作しよう! <ul><li>何ができる? </li></ul><ul><ul><li>画像データを ALAssetsLibrary で保存できます </li></ul></ul><ul><ul><li>メタデータ付きで保存できます </li></ul></ul>
    29. 29. Exif 情報を操作しよう! <ul><li>どんなときに便利? </li></ul><ul><ul><li>カメラロールにイメージデータを保存できます </li></ul></ul><ul><ul><li>メタデータ付きで保存できます </li></ul></ul><ul><ul><ul><li>Exif 情報も! </li></ul></ul></ul>
    30. 30. Exif 情報を操作しよう! <ul><li>// カメラロールにメタデータを付けて書き込み </li></ul><ul><li>NSDictionary* metadata = [representation metadata] ; </li></ul><ul><li>ALAssetsLibrary* l = [[ALAssetsLibrary alloc ] init ]; </li></ul><ul><li>  </li></ul><ul><li>[l writeImageToSavedPhotosAlbum :[representation fullScreenImage] </li></ul><ul><li>                        metadata :metadata </li></ul><ul><li>completionBlock :^( NSURL * url, NSError * e){ </li></ul><ul><li>               // 書き込み完了 </li></ul><ul><li>                                                NSLog ( @&quot;Saved: %@<%@>&quot; , url, e); </li></ul><ul><li>                 } </li></ul><ul><li>]; </li></ul><ul><li>[metadata release ]; </li></ul><ul><li>[l release ]; </li></ul>
    31. 31. (ただし iOS4.1 以降をお使いのお客様に限ります)
    32. 32. よくある質問 <ul><ul><li>フォトライブラリ内のデータを書き換えることはできますか? </li></ul></ul><ul><ul><li>CGImageRef ではなく生の、生のデータがほしいです </li></ul></ul><ul><ul><li>ALAssetRepresentation の url は変化することがあるのでしょうか? </li></ul></ul>
    33. 33. Assets Library を使うときの <ul><ul><li>URL を永続的に保持しないようにしましょう </li></ul></ul><ul><ul><li>アプリをマルチタスキングで動かす場合、通知「 ALAssetsLibraryChangedNotification 」をキチンと受け取りましょう </li></ul></ul><ul><ul><li>アセットのデータは非同期で受け取るものとしてアプリを設計しましょう </li></ul></ul>

    ×