如何使用 kCIFormatRGBAh 在 iOS 上使用 Core Image 获得半浮点数?

How to make use of kCIFormatRGBAh to get half floats on iOS with Core Image?

我正在尝试获取 CIImage 浮点数的每像素 RGBA 值。

我希望使用 CIContext 并呈现为 kCIFormatRGBAh 的以下内容能够正常工作,但输出全为零。否则我的下一步将从半浮点数转换为全浮点数。

我做错了什么?我也在 Objective-C 中尝试过这个并得到相同的结果。

let image = UIImage(named: "test")!
let sourceImage = CIImage(CGImage: image.CGImage)

let context = CIContext(options: [kCIContextWorkingColorSpace: NSNull()])
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bounds = sourceImage.extent()
let bytesPerPixel: UInt = 8
let format = kCIFormatRGBAh

let rowBytes = Int(bytesPerPixel * UInt(bounds.size.width))
let totalBytes = UInt(rowBytes * Int(bounds.size.height))
var bitmap = calloc(totalBytes, UInt(sizeof(UInt8)))

context.render(sourceImage, toBitmap: bitmap, rowBytes: rowBytes, bounds: bounds, format: format, colorSpace: colorSpace)

let bytes = UnsafeBufferPointer<UInt8>(start: UnsafePointer<UInt8>(bitmap), count: Int(totalBytes))

for (var i = 0; i < Int(totalBytes); i += 2) {
    println("half float :: left: \(bytes[i]) / right: \(bytes[i + 1])")
    // prints all zeroes!
}

free(bitmap)

这是关于获取 CIAreaHistogram 输出的 related question,这就是为什么我想要浮点值而不是整数,但我似乎无法让 kCIFormatRGBAh 继续工作任何 CIImage,无论其来源、过滤器输出或其他。

在 iOS

上将 RGBAh 与 [CIContext render:toBitmap:rowBytes:bounds:format:colorSpace:] 一起使用有两个限制
  1. rowBytes 必须是 8 字节的倍数
  2. 不支持在模拟器下调用

这些约束来自 iOS 上 RGBAh 的 OpenGLES 行为。