【问题标题】:IOS Photos frameworkIOS 照片框架
【发布时间】:2017-08-24 03:46:19
【问题描述】:

我想检索设备上所有本地相册中的所有照片。基本上设备上的所有照片 本地标识符列表是否唯一? 使用照片框架的最佳方法是什么。

我的问题不是重复的,因为另一个问题也涉及云资产和不在设备上的资产。当检索图像的实际数据时,它在尝试获取同步时返回空数据。

【问题讨论】:

标签: ios photos phasset


【解决方案1】:

我想检索所有本地相册中的所有照片 设备。基本上设备上的所有照片

编辑:fetchOptions.includeAssetSourceTypes = .typeUserLibrary见下面的代码

我就是这样做的:

var fetchResult: PHFetchResult<PHAsset>!

...

let fetchOptions = PHFetchOptions()     
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchOptions.includeAssetSourceTypes = .typeUserLibrary

fetchResult = PHAsset.fetchAssets(with: fetchOptions)

然后,如果我想将其用作 UImage 或缩略图(如果您希望将图像用作数据,请使用 let imageData: NSData = UIImagePNGRepresentation(myImage)),我使用:

/* 
 * From an asset to a UIImage, also can be used for thumbnail (if you change the :targetSize:)
 */
func getAsset(_ asset: PHAsset) -> UIImage {

    //var thumbnail = UIImage()
    var imageData = Data()

    let options = PHImageRequestOptions()
    options.isSynchronous = true
    options.deliveryMode = .opportunistic
    options.resizeMode = .fast
    options.isNetworkAccessAllowed = false

    PHImageManager.default().requestImage(for: asset, targetSize: view.frame.size, contentMode: .aspectFill, options: options) { image, info in

      //thumbnail = image!
        imageData: NSData = UIImagePNGRepresentation(image)
    }
    //You can check if the UIImage is nil. If it is nil is an iCloud image
    //return thumbnail
    return imageData
}

您可能会根据需要自定义上述代码或添加更多功能!

以上代码是使用 Swift 3.1 和 Xcode 8.3.1 编写和测试的

根据 Apple 的文档

isNetworkAccessAllowed 一个布尔值,指定照片是否可以从 iCloud 下载请求的图像。 如果为 true,并且请求的图像未存储在本地设备上,则照片会从 iCloud 下载图像。要获得下载进度通知,请使用 progressHandler 属性提供一个块,供照片在下载图像时定期调用。如果为 false(默认值),并且图像不在本地设备上,则结果处理程序的信息字典中的 PHImageResultIsInCloudKey 值指示图像不可用,除非您启用网络访问。

使用 getAsset() 方法从资产中检索图像。它的工作原理

【讨论】:

  • 这也返回云照片和我 tuens 同步照片。所以我再次想要设备上的所有照片
  • 但我想在尝试检索之前知道图像数据是否在设备上,这可能吗?
  • 阅读文档我认为没有直接的方法。因此,您可以将 fetchResult 与 getAsset 方法结合使用以获得您的解决方案。就计算速度而言,以这种方式获取照片已经足够快了。您是否还检查了图像的元数据,以防它们在 iCloud 中包含某些特定值?如果是这样,您可以过滤它们并仅获取它们。
  • 我正在检查数据是否为零,我想要一种不获取图像数据的方法。我如何确保数据在获取之前不会为零。
【解决方案2】:
PHFetchResult *smartAlbums;
smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

    for (NSInteger i =0; i < smartAlbums.count; i++)
{
    @autoreleasepool
    {
        PHAssetCollection *assetCollection = smartAlbums[i];
        //Camera Roll
        //All Photos //Moments
        NSLog(@"assetCollection.localizedTitle---%@",assetCollection.localizedTitle);

        // here you will get camera roll photos

        if([assetCollection.localizedTitle isEqualToString:@"Camera Roll"] || [assetCollection.localizedTitle isEqualToString:@"All Photos"] )
        {
            PHFetchOptions *options1 = [[PHFetchOptions alloc] init];
            options1.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
            options1.predicate = [NSPredicate predicateWithFormat:@"mediaType = %d",PHAssetMediaTypeImage];

            // here you will get all assets of your camera roll images in assetsFetchResult
            PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:options1];
        }
    }
}

【讨论】:

  • 这会让我得到所有图像吗?或者只有相机胶卷。这在 ios 10 中有效吗?这是否与 ios 9 向后兼容。可以说这是检索 whatsapp 图像吗?
  • 你会得到相机胶卷的所有图像,默认所有图像都只在相机胶卷下
  • 设备上但在其他相册中的图片呢?
  • 你知道一件事,所有的照片都只会在相机胶卷下。它会向您展示新专辑,但它也在相机胶卷中。这意味着您可以从相机胶卷中获取所有照片。
  • 你的回答中的所有相册是什么?
【解决方案3】:

第 1 步。

在您的项目中嵌入 Photos.framework

第 2 步

#import <Photos/Photos.h>

第 3 步

在 plist 上添加 NSPhotoLibraryUsageDescription 键

<key>NSPhotoLibraryUsageDescription</key>
<string>${PRODUCT_NAME} PhotoLibrary Usage</string>

第 4 步

编写此代码以获取 PHFetchResult

PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];

PHFetchResult *tempAssetsFetchResults = [PHAsset fetchAssetsWithOptions:options];
tempAssetsFetchResults = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];

【讨论】:

  • 这也返回云照片和我 tuens 同步照片。所以我再次想要设备上的所有照片
  • PHFetchOptions *syncedOption = [[PHFetchOptions alloc] init]; syncedOption.includeAssetSourceTypes=PHAssetSourceTypeNone;
  • 你得到结果了吗
  • 对不起,回答迟了,不,我没有 PHAssetSourceTypeNone 是什么意思?即使是基于云的照片,我也总是能得到它。
猜你喜欢
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
相关资源
最近更新 更多