30

ユーザーの介入なしに、カメラロール内の最新の写真をプログラムで取得する方法を理解するのに苦労しています。明確にするために、私はイメージピッカーを使用したくありません。アプリが開いたときにアプリが自動的に最新の写真を取得するようにしたいのです。

同様のアプリがそれを行うのを見たので、これが可能であることは知っていますが、それに関する情報を見つけることができないようです。

4

7 に答える 7

47

1つの方法は、AssetsLibraryを使用し、列挙のインデックスとしてn-1を使用することです。

ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                             usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
                                 if (nil != group) {
                                     // be sure to filter the group so you only get photos
                                     [group setAssetsFilter:[ALAssetsFilter allPhotos]];

                                     if (group.numberOfAssets > 0) {
                                         [group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:group.numberOfAssets - 1]
                                                                 options:0
                                                              usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
                                                                  if (nil != result) {
                                                                      ALAssetRepresentation *repr = [result defaultRepresentation];
                                                                      // this is the most recent saved photo
                                                                      UIImage *img = [UIImage imageWithCGImage:[repr fullResolutionImage]];
                                                                      // we only need the first (most recent) photo -- stop the enumeration
                                                                      *stop = YES;
                                                                  }
                                                              }];
                                     }
                                 }

                                 *stop = NO;
                             } failureBlock:^(NSError *error) {
                                 NSLog(@"error: %@", error);
                             }];
于 2012-04-17T23:54:49.620 に答える
7

Swift 3.0:

1) クラス宣言の前にヘッダーに Photos フレームワークをインポートします。

import Photos


2) 最後の画像を返す次のメソッドを追加します。

func queryLastPhoto(resizeTo size: CGSize?, queryCallback: @escaping ((UIImage?) -> Void)) {
    let fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

    let requestOptions = PHImageRequestOptions()
    requestOptions.isSynchronous = true

    let fetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)
    if let asset = fetchResult.firstObject {
        let manager = PHImageManager.default()

        let targetSize = size == nil ? CGSize(width: asset.pixelWidth, height: asset.pixelHeight) : size!

        manager.requestImage(for: asset,
                             targetSize: targetSize,
                             contentMode: .aspectFit,
                             options: requestOptions,
                             resultHandler: { image, info in
                                queryCallback(image)
        })
    }

}


3) 次に、このメソッドをアプリのどこかで呼び出します (おそらくボタン アクション)。

@IBAction func pressedLastPictureAttachmentButton(_ sender: Any) {
    queryLastPhoto(resizeTo: nil){
        image in
        print(image)
    }
}
于 2016-12-29T23:12:45.233 に答える
6

Art Gillespie の回答に追加するにfullResolutionImageは、元の画像を使用すると、写真を撮るときのデバイスの向きによっては、逆さままたは-90°の画像が残る可能性があります。

このために変更されたが最適化された画像を取得するには、fullScreenImage代わりに....を使用します。

 UIImage *img = [UIImage imageWithCGImage:[repr fullScreenImage]];
于 2012-08-18T15:47:12.473 に答える