获取未压缩的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输入,因此这可能是更好的选择。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...