首页 文章

确定iOS设备上可用的最大PHAsset图像大小

提问于
浏览
50

如何确定iOS设备上可用的最大 PHAsset 图像大小,其中"available"我的意思是当前在设备上,不需要从iCloud Photo Library下载任何网络?

我一直在开发一个应用程序,其中缩略图的集合显示在 UICollectionView (很像照片应用程序),然后用户可以选择图像以查看它的完整大小 . 如有必要,可从iCloud下载完整大小的图像 . 但是,我希望向用户显示图像的最大版本,直到完整大小可用 .

Photos Framework的工作方式相当奇怪:

在集合视图中,我正在使用 PHCachingImageManager (以及后来的request)图像,其中_1354186_为186x186像素(由于视网膜缩放,因此尺寸为 UICollectionViewCell 的两倍) .

这非常有效,滚动非常快,并且在用图像填充单元格时没有延迟 . 检查返回图像的大小,它们大约是342x256像素 . 这是在我的iPhone 6上启用了iCloud Photo Library并启用了“优化存储”,因此大多数图像只能在设备上存储小的缩略图 .

然而,奇怪的是,如果我然后使用PHImageRequestOptionsDeliveryMode.Opportunistic选项使用 PHCachingImageManagerPHImageManager.defaultManager() 请求任何图像的完整大小(或更大)版本,则返回的第一个(低质量)图像是一个小的60x45像素邮资在全屏幕上看起来很糟糕的邮票,直到最终下载完整尺寸的图像来替换它 .

显然,设备上已有更大的缩略图(342x256),因为它们只是在集合视图中显示!那么为什么在下载完整尺寸之前,地狱还没有低质量的图像?为了确保342x256图像确实已经在设备上,我在飞行模式下运行代码,因此没有发生网络访问 .

我发现如果我要求任何大小高达256x256我会得到342x256图像返回 . 一旦我变大(甚至1个像素),它将首先返回60x45图像然后尝试下载全尺寸图像 .

我已经更改了我的代码以首先发出256x256请求,然后是 PHImageRequestOptionsDeliveryMode.HighQualityFormat 的完整大小请求(这也是iOS照片应用程序必须执行的操作,因为它在下载完整图像时显示相对高质量的缩略图 .

那么,在这样的背景下,我怎么知道 PHAsset 的设备图像尺寸最大? 256x256是一个神奇的数字,还是取决于iCloud Photo Library如何优化空间(基于库的大小和可用的设备存储)?

当然,似乎是一个错误,照片框架没有返回当前可用的最大图像(当要求的尺寸大于目前的尺寸),并且要获得它拥有的最大尺寸,你必须要求这个尺寸或更小,因为如果你要求更大,你将获得60x45的缩影!离奇 .

UPDATE: 提交给Apple的错误报告:https://openradar.appspot.com/25181601
演示该错误的示例项目:https://github.com/mluisbrown/PhotoKitBug

3 回答

  • 0

    使用问题中发布的示例项目,我能够在模拟器中重现该问题,但是当我进行以下更改时,我只会收到最大的图像:

    let targetSize = PHImageManagerMaximumSize
    
  • 1

    实际上我不知道苹果会用PHImageResultIsDegradedKey = 1返回降级的45 * 60图像的原因 . 对我来说,我只是首先使用deliveryMode PHImageRequestOptionsDeliveryModeHighQualityFormat请求256 * 256图像,然后我使用其他PHImageRequestOptions来请求完整大小的图像,如下所示:

    PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
    options.networkAccessAllowed = YES;
    options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
    options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info){
    // code to update the iCloud download progress
    });
    
    [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
    // code to update UIImageView or something else.
    });
    

    我认为,Instagram可能会使用这种类似的解决方案来处理来自iCloud的图像 .

  • -2
    [imageManager requestImageForAsset:asset
                  targetSize: PHImageManagerMaximumSize
                  contentMode:PHImageContentModeAspectFill
                  options:nil
    resultHandler:^(UIImage *result, NSDictionary *info)
    {
        result;
    }];
    

相关问题