ios - 使用 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")
}
}
解决方案
我认为问题在于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
. 然后,您不需要将文件保存到某个中间位置(之后您需要将其删除)。
推荐阅读
- javascript - 在 JavaScript 中检测 Apple Silicon mac
- kubernetes - 有没有一种有效的方法来创建一种机制来自动更新 Kubernetes 中的 osrm 映射数据?
- http - 为什么即使我通过了规则,我也会收到 CSP frame-src 错误?
- javascript - 使用二进制表示更新基于隐藏字段(反之亦然)的复选框数组
- angularjs - angularjs-route 未加载 angular --prod 标志(angular-cli)
- android - Change hint programmaticaly with kotlin for material.textfield
- c++ - C++::使用模板技巧访问多个私有成员
- php - 从 foreach xml 值中的 foreach 在数组中创建数组
- robotframework - 网页上的文字可见
- python - Abaqus python脚本:选择共享相同坐标的两个连接器之一