如何使用PHImageManager获取原始图像

时间:2019-05-28 09:16:29

标签: ios objective-c ios10 phasset 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获取原始图像。

3 个答案:

答案 0 :(得分:1)

我将在 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,以便我可以知道返回值的位置。 如果不需要索引变量,可以删除。

答案 1 :(得分:0)

使用以下代码获取原始图像。我在Swift中有代码,您应该将其转换为Objective-C

PHImageManager.default().requestImage(for: phAssets.firstObject!, targetSize: PHImageManagerMaximumSize, contentMode: PHImageContentMode.default, options: requestOption) { (image, dictResult) in

    // Get file path url of original image.
    if let url = dictResult!["PHImageFileURLKey"] as? URL {
        self.getImageFromFileUrl(url)
    }
}


func getImageFromFileUrl(_ fileUrl: URL) {

    // Get dat from url, here I have not using catch block, you must use it for swift.
    let imageData = try? Data(contentsOf: fileUrl)

    // Get image from data
    let image = UIImage(data: imageData!)

    // Size count, which is same as original image
    let size = ByteCountFormatter()
    print("image size = \(size.string(fromByteCount: Int64(imageData!.count)))")
}

有关详细信息,我在代码行上方添加了注释。

我希望这会对您有所帮助。

答案 2 :(得分:0)

我写了一个函数来获取下面的原始图像,它对我有用。希望它也适用于您。

    func getAssetThumbnail(asset: PHAsset) -> UIImage {
    let manager = PHImageManager.default()
    let option = PHImageRequestOptions()
    var thumbnail = UIImage()
    option.isSynchronous = true
    option.isNetworkAccessAllowed = true
    option.resizeMode = .none
    
    manager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: option) { (result, info) in
        thumbnail = result!
    }
    return thumbnail
}