如何解决获取未压缩的CIImage数据
我正在尝试获取CIImage
解压缩数据。
目前,我发现获得压缩数据的唯一方法是使用CIContext
,如下所示:
let ciContext = CIContext()
let ciImage = CIImage(color: .red).cropped(to: .init(x: 0,y: 0,width: 192,height: 192))
guard let ciImageData = ciContext.jpegRepresentation(of: ciImage,colorSpace: CGColorSpace(name: CGColorSpace.sRGB)!,options: [:]) else {
fatalError()
}
print(ciImageData.count) // Prints 1331
是否可以(尽可能有效地)获取未压缩的CIImage
数据?
解决方法
如您所见,ciContext.jpegRepresentation
正在将图像数据压缩为JPEG,并为您提供了一个Data
对象,该对象可以作为JPEG文件原样写入磁盘(包括图像元数据)。 / p>
您需要使用其他CIContext
API来直接呈现(未压缩的)位图数据:
let rowBytes = 4 * Int(ciImage.extent.width) // 4 channels (RGBA) of 8-bit data
let dataSize = rowBytes * Int(ciImage.extent.height)
var data = Data(count: dataSize)
data.withUnsafeMutableBytes { data in
ciContext.render(ciImage,toBitmap: data,rowBytes: rowBytes,bounds: ciImage.extent,format: .RGBA8,colorSpace: CGColorSpace(name: CGColorSpace.sRGB)!)
}
或者,您可以创建具有正确大小和格式的CVPixelBuffer
并使用CIContext.render(_ image: CIImage,to buffer: CVPixelBuffer)
来呈现。我认为Core ML直接支持CVPixelBuffer
输入,因此这可能是更好的选择。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。