首页 > 解决方案 > 如何使用 PHImageManager 获取原始图像

问题描述

我正在使用以下代码从 PHAsset 获取原始图像:

PHImageRequestOptions *requestOptions = [[PHImageRequestOptions alloc] init];
requestOptions.resizeMode   = PHImageRequestOptionsResizeModeNone;
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;

[[PHImageManager defaultManager] requestImageForAsset:phasset
                                                                   targetSize:PHImageManagerMaximumSize
                                                                  contentMode:PHImageContentModeDefault
                                                                      options:requestOptions
                                                                resultHandler:^void(UIImage *image, NSDictionary *info) {
                                                                    if (image) {
                                                                                                        }
}];

但发现,图像尺寸大于原始尺寸。我选择了54 MB文件,但发现它的大小123.5MB作为响应。使用以下代码计算图像大小:

NSData *imgData = UIImageJPEGRepresentation(image, 1.0);
NSLog(@"img size: %@", [[NSByteCountFormatter new] stringFromByteCount:imgData.length]);

知道如何使用 [[PHImageManager defaultManager] requestImageForAsset:API 获取原始图像。

标签: iosobjective-cios10phassetphimagemanager

解决方案


我将在 Swift 5 中分享我的代码。就我而言,以下代码在 iOS 14.5.1 上运行良好。

extension PHAsset {
    func getImageData(_ index: Int, completionHandler: @escaping((_ index: Int, _ image: UIImage?)->Void)) {
        let options = PHImageRequestOptions()
        options.isSynchronous = true
        options.isNetworkAccessAllowed = true
        PHImageManager.default().requestImage(for: self, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: options, resultHandler: { (image, info) in
            completionHandler(index, image)
        })
    }
}

因为我在后台线程中调用 getImageData 并且返回值没有正确排序,所以我使用一个名为 index 的变量来调用 order,然后将它传递给 completionHanlder 以便我可以知道返回值的位置。如果不需要索引变量,可以将其删除。


推荐阅读