首页 > 解决方案 > 使用 writeJPEGRepresentation 函数保存具有深度数据的 CIImage

问题描述

我有一张带有深度数据的肖像图像,经过一些处理后,我想将其副本保存到保留深度数据的用户相册中(UIImage在这种情况下不是一个选项)。对于这项任务,我正在使用writeJPEGRepresentation()似乎成功地将带有深度信息的修改后图像保存到某处的功能;但是,它不会出现在相册中。

为了出现在相册里,我在尝试performChanges()的功能的PHPhotoLibrary时候,这次出现在相册上,但不是修改过的,而是原版的!?任何帮助高度赞赏。谢谢。

这是代码:

func saveWithDepth(image : CIImage) {
    do {
        let colorSpace = CGColorSpace(name: CGColorSpace.sRGB)
        let depthdata = DepthData
        let url = Url
        try Context.writeJPEGRepresentation(of: image, to: url!, colorSpace: colorSpace!,
                                            options: [CIImageRepresentationOption.avDepthData :depthdata!])

        PHPhotoLibrary.shared().performChanges({
            let options = PHAssetResourceCreationOptions()
            let creationRequest = PHAssetCreationRequest.forAsset()
            creationRequest.addResource(with: .alternatePhoto, fileURL: url!, options: options)
        }, completionHandler: { success, error in
            if !success {
                print("AVCam couldn't save the movie to your photo library: \(String(describing: error))")
            }
        })
    } catch {
        print("failed")
    }
}

标签: iosswiftphotocore-imagephphotolibrary

解决方案


我认为问题在于JPEG无法存储深度数据(据我所知)。HEIF 将是您应该使用的格式。也许你可以尝试这样的事情:

func saveWithDepth(image: CIImage) {
    let colorSpace = CGColorSpace(name: CGColorSpace.sRGB)
    let depthdata: DepthData
    let imageData = context.heifRepresentation(of: image, format: .BGRA8, colorSpace: colorSpace!,
                                               options: [CIImageRepresentationOption.avDepthData: depthdata!])

    PHPhotoLibrary.shared().performChanges({
        let options = PHAssetResourceCreationOptions()
        let creationRequest = PHAssetCreationRequest.forAsset()
        creationRequest.addResource(with: .photo, data: imageData, options: options)
    }, completionHandler: { success, error in
        if !success {
            print("Couldn't save the photo to your photo library: \(String(describing: error))")
        }
    })
}

几点说明:

  • 我假设depthdata实际上是一个有意义的值?
  • 您可以创建并稍后将图像数据直接传递给creationRequest. 然后,您不需要将文件保存到某个中间位置(之后您需要将其删除)。

推荐阅读