如何使用Photos Framework在相机胶卷中仅获取图像

Wil*_*con 24 ios swift photosframework

以下代码加载也位于iCloud或流图像上的图像.我们如何将搜索限制为仅限相机胶卷中的图像?

var assets = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: nil)
Run Code Online (Sandbox Code Playgroud)

Sta*_*ort 20

添加Camera Roll和Photo Stream相册后,Apple PHAssetCollectionSubtype在iOS 8.1中添加了以下类型:

  1. PHAssetCollectionSubtypeAlbumMyPhotoStream(连同PHAssetCollectionTypeAlbum) - 获取Photo Stream专辑.

  2. PHAssetCollectionSubtypeSmartAlbumUserLibrary(连同PHAssetCollectionTypeSmartAlbum) - 获取相机胶卷相册.

尚未测试它是否与iOS 8.0.x向后兼容.

  • 嗯。“ PHAssetCollectionSubtypeSmartAlbumUserLibrary”在我的iPad上列出了14,850个项目。那就是整个照片集,而不是我的iPad上的东西... (2认同)

Wil*_*con 6

通过一些实验,我们发现了一个未在文档(assetSource)中列出的隐藏属性.基本上你必须做一个常规的提取请求,然后使用谓词来过滤相机胶卷中的谓词.该值应为3.

示例代码:

//fetch all assets, then sub fetch only the range we need
var assets = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions)

assets.enumerateObjectsUsingBlock { (obj, idx, bool) -> Void in
    results.addObject(obj)
}

var cameraRollAssets = results.filteredArrayUsingPredicate(NSPredicate(format: "assetSource == %@", argumentArray: [3]))
results = NSMutableArray(array: cameraRollAssets)
Run Code Online (Sandbox Code Playgroud)

  • <插入关于依赖未记录的API的标准免责声明> (6认同)

kar*_*ran 5

如果您正在像我一样搜索Objective C代码,并且由于不赞成使用AssetsLibrary的代码而没有得到新库/ Photo Framework的答案,那么这将为您提供帮助: Swift

全局变量:

var imageArray: [AnyObject]
var mutableArray: [AnyObject]

convenience func getAllPhotosFromCamera() {
    imageArray = [AnyObject]()
    mutableArray = [AnyObject]()
    var requestOptions: PHImageRequestOptions = PHImageRequestOptions()
    requestOptions.resizeMode = .Exact
    requestOptions.deliveryMode = .HighQualityFormat
    requestOptions.synchronous = true
    var result: PHFetchResult = PHAsset.fetchAssetsWithMediaType(.Image, options: nil)
    NSLog("%d", Int(result.count))
    var manager: PHImageManager = PHImageManager.defaultManager()
    var images: [AnyObject] = [AnyObject](minimumCapacity: result.count)
        // assets contains PHAsset objects.
    var ima: UIImage
    for asset: PHAsset in result {
        // Do something with the asset
        manager.requestImageForAsset(asset, targetSize: PHImageManagerMaximumSize, contentMode: .Default, options: requestOptions, resultHandler: {(image: UIImage, info: [NSObject : AnyObject]) -> void in
Run Code Online (Sandbox Code Playgroud)

目标C

全局变量:

NSArray *imageArray;
NSMutableArray *mutableArray;
Run Code Online (Sandbox Code Playgroud)

下面的方法将帮助您:

-(void)getAllPhotosFromCamera
{
    imageArray=[[NSArray alloc] init];
    mutableArray =[[NSMutableArray alloc]init];

    PHImageRequestOptions *requestOptions = [[PHImageRequestOptions alloc] init];
    requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
    requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
    requestOptions.synchronous = true;
    PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];

    NSLog(@"%d",(int)result.count);

    PHImageManager *manager = [PHImageManager defaultManager];
    NSMutableArray *images = [NSMutableArray arrayWithCapacity:[result count]];

    // assets contains PHAsset objects.

    __block UIImage *ima;
    for (PHAsset *asset in result) {
        // Do something with the asset

        [manager requestImageForAsset:asset
                           targetSize:PHImageManagerMaximumSize
                          contentMode:PHImageContentModeDefault
                              options:requestOptions
                        resultHandler:^void(UIImage *image, NSDictionary *info) {
                            ima = image;

                            [images addObject:ima];
                        }];


    }

    imageArray = [images copy];  // You can direct use NSMutuable Array images
}
Run Code Online (Sandbox Code Playgroud)