获取未压缩的 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
输入,所以这可能是更好的选择。
我正在尝试获取 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
输入,所以这可能是更好的选择。