问题描述
我想知道使用 PHImageManager.default().requestimage 获取 RAW 图像文件并获得完整分辨率的最佳和最可靠的方法是什么?
我有一些代码需要遍历一组图像。对于 JPG、TIF、PNG 等,一切正常。 对于从另一台相机拍摄的任何 RAW 图像,它工作正常,但前提是我先离开设备对 RAW 文件进行某种处理几分钟。如果我尝试在导入后直接读取图像,几乎总是加载低分辨率版本。 我一次只需要一个图像,所以一旦我使用了 PHPicker,它们也会进入自动释放循环。
到目前为止,我已经尝试了“PHImageManager.default().requestimage”和“PHImageManager.default().requestimageDataAndOrientation”
使用 .requestimage,除了新导入的原始文件外,一切都很完美...
使用.requestimageDataAndOrientation,它似乎在导入后立即加载完整的RAW图像数据,但对于iCloud照片库中的照片(无论是否优化)和共享相册中的照片,它可以随机返回nil。我知道这种方法更适合存储在设备上的图像,但我知道情况并非总是如此。
我的 PHImageRequestOptions 显示如下:
let options = PHImageRequestOptions()
options.isSynchronous = true
options.isNetworkAccessAllowed = true
options.resizeMode = .exact
options.version = .unadjusted
options.deliveryMode = .highQualityFormat
options.progressHandler = { [self] (progress,error,stop,info) in
titleProgress(txt: "\(Int(loopNo - 1)) of \(Int(c - 1)) - (Downloading \(Int(progress * 100))%)")
}
我使用这个获取图像:
let theAsset = PHAsset.fetchAssets(withLocalIdentifiers:
[imgArray[n].assetID],options: nil)[0]
PHImageManager.default().requestimage(for: theAsset,targetSize: CGSize(width: theAsset.pixelWidth,height: theAsset.pixelHeight),contentMode: PHImageContentMode.aspectFill,options: options,resultHandler: { [self]
(image,info) in
if image != nil {
因此,如果我将 SD 卡中的 50 张图像导入库并运行该应用程序,则可能有 5 张图像会加载完整分辨率。如果我再离开它 2 分钟,大约一半会加载完整的分辨率。再过几分钟,它们都会加载全分辨率,看起来完全没问题。但是每个加载的图像无论是全分辨率还是低分辨率都会为信息提供 0![PHImageResultIsDegradedKey]!这对我来说没有意义。
所以我探索的另一个选择是使用 .requestimage 从云中可靠地提取图像(或者即使照片库设置为下载原件也只加载它),然后使用 .requestimageDataAndOrientation 以全分辨率获取 RAW 图像。
let theAsset = PHAsset.fetchAssets(withLocalIdentifiers: [imgArray[n].assetID],targetSize: CGSize(width: theAsset.pixelWidth,info) in
if image != nil {
PHImageManager.default().requestimageDataAndOrientation(for: theAsset,options: options) { (data,_,_) in
let imageData = UIImage(data: data!)!
这样做实际上允许我在导入后立即获得全分辨率的 RAW 文件,但行...
let imageData = UIImage(data: data!)!
偶尔会失败并显示错误“致命错误:在解包可选值时意外发现 nil”,即使此时“数据”永远不会为零。由于某种原因,它不会转换为 UIImage。
就目前而言,我认为我唯一的选择是检查文件是否为 RAW,并建议用户等待一分钟左右,让设备以可以正确读取的方式处理图像。
>是否有更好的做法可以在我完全错过的设备上读取 RAW 文件,或者我只是在代码中做错了什么?
非常感谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)