Your SlideShare is downloading. ×
yidev第七回勉強会:「Assets Library手習い」発表資料
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

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

14,924
views

Published on

2010年12月11日の横浜で行われたyidev第七回勉強会のスライドです。 …

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
14,924
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
30
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
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
  • Transcript

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