3

我正在尝试获取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,这就是为什么我想要浮点值而不是整数的原因,但无论其来源、过滤器输出或其他方式如何,我似乎都无法kCIFormatRGBAh处理任何问题。CIImage

4

1 回答 1

2

[CIContext render:toBitmap:rowBytes:bounds:format:colorSpace:]在 iOS上使用 RGBAh 有两个限制

  1. rowBytes 必须是 8 个字节的倍数
  2. 不支持在模拟器下调用

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

于 2015-02-10T00:55:10.317 回答