使用 writeJPEGRepresentation 函数保存具有深度数据的 CIImage

Posted

技术标签:

【中文标题】使用 writeJPEGRepresentation 函数保存具有深度数据的 CIImage【英文标题】:Saving CIImage with Depth data with writeJPEGRepresentation function 【发布时间】:2019-12-18 13:07:09 【问题描述】:

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

为了出现在相册中,我在尝试phphotoLibraryperformChanges()功能时, 这次出现在专辑里的不是修改版而是原版!? 任何帮助高度赞赏。谢谢。

代码如下:

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")
    

【问题讨论】:

你解决过这个问题吗? 【参考方案1】:

我认为问题在于 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。然后,您无需将文件保存到某个中间位置(之后您需要将其删除)。

【讨论】:

heifRepresentation() 和 jpegRepresentation() 或它们的 url 版本都不起作用。我认为问题可能是苹果没有在选择 avDepthData 选项的情况下实现它们。没有这些选项,图像被保存,但没有深度数据。 顺便说一下,JPEG 存储深度数据。我认为苹果使用启用深度的版本。因为图库中的图像具有 jpeg 扩展名(并且具有深度)

以上是关于使用 writeJPEGRepresentation 函数保存具有深度数据的 CIImage的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)