获取未压缩的 CIImage 数据

getting uncompressed CIImage data

我正在尝试获取 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 文件写入 as-is 磁盘(包括图像元数据)。

您需要使用不同的 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 输入,所以这可能是更好的选择。