↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > PHAssetでiPhone端末の画像を全てリストアップ

PHAssetでiPhone端末の画像を全てリストアップ

iOS8からの新機能のPhotos FrameworkのPHAssetを利用して端末に含まれる画像写真のリストアップを行ってみます。

参考:Photos Framework を使って写真.appと画像をやりとりする 参考:How to get only images in the camera roll using Photos Framework
参考:PHAsset
参考:PHImageManager
参考:【iOS】ALAssetのいじったときのメモまとめ、カメラロールから画像を!
参考:Swiftを使って「ハワイに行ったふりカメラ」をつくる
参考:ALAssetsLibraryのALAssetからNSDataを作る
参考:【iOS】iPhoneのカメラロールにアクセスするAssetsLibraryについて

ひとまずやってみました。


        //全てのカメラロールの画像を取得する。
        var assets:PHFetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: nil)
        println(assets.debugDescription);
        assets.enumerateObjectsUsingBlock({ obj, idx, stop in
            
            if obj is PHAsset
            {
                let asset:PHAsset = obj as PHAsset;
                println("Asset IDX:\(idx)");
                println("mediaType:\(asset.mediaType)");
                println("mediaSubtypes:\(asset.mediaSubtypes)");
                println("pixelWidth:\(asset.pixelWidth)");
                println("pixelHeight:\(asset.pixelHeight)");
                println("creationDate:\(asset.creationDate)");
                println("modificationDate:\(asset.modificationDate)");
                println("duration:\(asset.duration)");
                println("favorite:\(asset.favorite)");
                println("hidden:\(asset.hidden)");
            }
        });
        

上記、カメラロール以外からも収集してしまいますが、ひとまず簡単なサンプルです。以下の様な出力を行います。


 count=6
Asset IDX:0
mediaType:(Enum Value)
mediaSubtypes:C.PHAssetMediaSubtype
pixelWidth:1500
pixelHeight:1001
creationDate:2014-07-14 04:28:16 +0000
modificationDate:2014-07-14 04:28:16 +0000
duration:0.0
favorite:false
hidden:false
Asset IDX:1
mediaType:(Enum Value)
mediaSubtypes:C.PHAssetMediaSubtype
pixelWidth:834
pixelHeight:1250
creationDate:2014-07-14 04:28:17 +0000
modificationDate:2014-07-14 04:28:17 +0000
duration:0.0
favorite:false
hidden:false
...

収集する際のPHAssetMediaTypeImage(画像),Audio(音声),Video(動画)と変更することでそれぞれの メディアのみを収集することができます。

このPHAssetからUIImageを作成する

PHAssetから画像を取り出すにはPHImageManagerを利用します。


        //全てのカメラロールの画像を取得する。(iCloudも含む)
        var assets:PHFetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: nil)
        println(assets.debugDescription);
        assets.enumerateObjectsUsingBlock({ obj, idx, stop in
            
            if obj is PHAsset
            {
                let asset:PHAsset = obj as PHAsset;
                println("Asset IDX:\(idx)");
                println("mediaType:\(asset.mediaType)");
                println("mediaSubtypes:\(asset.mediaSubtypes)");
                println("pixelWidth:\(asset.pixelWidth)");
                println("pixelHeight:\(asset.pixelHeight)");
                println("creationDate:\(asset.creationDate)");
                println("modificationDate:\(asset.modificationDate)");
                println("duration:\(asset.duration)");
                println("favorite:\(asset.favorite)");
                println("hidden:\(asset.hidden)");
                
                
                let phimgr:PHImageManager = PHImageManager();
                phimgr.requestImageForAsset(asset,
                    targetSize: CGSize(width: 320, height: 320),
                    contentMode: .AspectFill, options: nil) {
                        image, info in
                        //ここでUIImageを取得します。
                        //self.photoImageView.image = image
                        println("UIImage get!");
                }
                
            }
        });

このfetchAssetsWithMediaTypeのFetchOptionsをいじってみる

PHFetchOptionsを利用して、creationDateが一年前より新しいデータを取得する例。あまりWebに掲載がなかったので覚書。


        let fetchOptions = PHFetchOptions();
        
        var date:NSDate = NSDate();
        date = NSDate(timeIntervalSinceNow: -365*24*60*60);//1年前
        
        fetchOptions.predicate = NSPredicate(format: "creationDate > %@", date);
        fetchOptions.sortDescriptors =  [NSSortDescriptor(key: "creationDate", ascending: false)];
        var assets:PHFetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions)
        println(assets.lastObject);
        

↓こんな記事もありますよ!


2021-05-14 14:21:41

WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。

AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、 昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は...

2021-05-06 14:04:37

LINEのアニメーションスタンプ制作の落とし穴、、、失敗談

ゴールデンウィークにLINEスタンプを作成してみました。 作り切って申請も通したんですが、意図したアニメーションと違う、、、、 LINEクリエーターの画面だと、アニメーションのプレビュー...

2021-05-01 18:05:35

久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。

忘れないようにメモ エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。 ターゲット→ex...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!