我有一个带有深度数据的肖像图像,经过一些处理,我想将其副本保存到保留深度数据的用户相册中(在这种情况下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")
}
}
我认为问题是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
。然后,您无需将文件保存到某个中间位置(之后需要将其删除(。