ios - 如何使用 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 获取原始图像。
解决方案
我将在 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 以便我可以知道返回值的位置。如果不需要索引变量,可以将其删除。
推荐阅读
- python - Python - 双不可行错误 SVM 二次问题 OSQP
- angular - 如何使用复选框过滤角度 8 中的垫表
- django - 将大文件上传到不同云服务时的最佳顺序
- python - 如何使用类中的字段?
- java - 如何在 Anylogic 的一个流程图中处理不同的材料?
- javascript - react-native 构建成功但没有显示
- node.js - node.js - 如何检查/获取 ssl 证书到期日期
- ios - dyld:库未加载:@rpath/Alamofire.framework/Alamofire 和 AlamofireImage
- android - Android 应用裁剪图像并将其发送到另一个活动
- ruby-on-rails - 从参数中的json响应中获取最低的数字/整数