Swift - 在照片应用程序中读取新导入的 RAW 文件

问题描述

我想知道使用 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 (将#修改为@)