我想将 CIImage 渲染到 kCVPixelFormatType_128RGBAFloat 类型的像素缓冲区中。但是 CIContext.render() 没有说“不支持的格式”。我在运行 iOS 11 的 iPhone 7 Plus 上进行了测试。
这是我的代码:
let context = CIContext()
var buffer: CVPixelBuffer? = nil
let buffer = CVPixelBufferCreate(nil,
width,
height,
kCVPixelFormatType_128RGBAFloat,
nil,
&buffer)
assert(buffer != nil, "Couldn't create buffer")
context.render(ciImage, to: buffer)
缓冲区创建成功——断言没有触发。只有最后一行的渲染没有说“不支持的格式”。
我还尝试通过将第二个 nil 替换为来创建一个IOSurface 支持的 CVPixelBuffer[kCVPixelBufferIOSurfacePropertiesKey: [:]] as CFDictionary
,但它没有帮助。
我怎样才能让它工作?
格式需要为 kCVPixelFormatType_128RGBAFloat,因为这里太复杂,无法进入,简短的版本是像素值的范围大于 0-255,包括不能四舍五入的小数值。
我尝试了更多的东西:
- kCVPixelFormatType_64ARGB
- 软件渲染器
- 创建由 EAGLContext 支持的CIContext
- 创建由 MTLDevice 支持的CIContext
- 调用 CIContext。创建CGImage ()
- 渲染到 MTLTexture,但我不知道如何创建一个。
- 渲染到 IOSurface
- 在CIContext () 上调用clearCaches ()。
- 调用reclaimResources (),但这在 iOS 上不可用。
- 检查我的输入是 < CIContext. inputImageMaximumSize () 和outputImageMaximumSize ()
- 渲染到原始字节数组。
这些都不起作用。Core Image 不支持渲染到每通道浮点数 32 位还是每通道整数 16 位?