如何从 CIRowAverage 过滤器中获取值?

How do I get values from CIRowAverage filter?

我正在尝试使用 Apple 的 CIRowAverage Core Image 过滤器来计算图像每行的平均值。当我 运行 过滤器并尝试读出值时,我根本没有得到平均值:从我可以判断的行中有一个值的地方,它 returns 255 和任何地方一行没有值(即全部为 0),它 returns 0.

那么,我是CIRowAverage用错了还是我误解了它的用法?

我是这样称呼它的:

let row = ciimage.applyingFilter("CIRowAverage", parameters: ["inputExtent": CIVector(cgRect: ciimage.extent)])

let width = Int(ciimage.extent.width)
let height = Int(ciimage.extent.height)
let bufferSize = width * height * 4
var buffer = [UInt8](repeating: 0, count: bufferSize)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let context = CGContext(data: &buffer, width: width, height: height, bitsPerComponent: 8, bytesPerRow: 4 * width, space: colorSpace, bitmapInfo: CGImageAlphaInfo.noneSkipLast.rawValue)!
let ciContext = CIContext(cgContext: context, options: [kCIContextWorkingColorSpace: colorSpace, kCIContextUseSoftwareRenderer: false])
ciContext.draw(self, in: self.extent, from: self.extent)
return buffer

首先,我认为您正确地理解了过滤器的功能。我从未使用过它(或任何缩减过滤器),但我认为您使用的 一个像素输出 可能是错误的。

尝试以这种方式呈现输出:

// I'm assuming you are passing a single row here but your ROI suggests maybe not

let row = ciimage.applyingFilter("CIRowAverage", parameters: ["inputExtent": CIVector(cgRect: ciimage.extent)])

// Create a CIContext, then a CGImage, and finally a UIImage

let ciCtx = CIContext()
let cgImage = renderContext.createCGImage(row, from: ciimage.extent)
let uiImage =  UIImage(cgImage: cgImage)

您没有 post 代码来指示 climate.extent 是什么或 self 是什么,所以请记住以下几点:

  • 我认为输入的 ROI 应该是一行图像。
  • 输出只有一个像素高inputCount
  • 创建 CIContexts 是一件非常昂贵的事情,所以尽量只创建一个。
  • 如果您试图以 单个 图像结束 each 行的平均颜色,请相应地更改您的代码(和我的) .

注意:请记住,CoreImage 的“原点”位于左下角,而不是左上角。也就是说,UIKit 或 CoreGraphics 之类的东西将 0,0 的 X/Y 定位为左上角,而 CoreImage 将 0,0 定位为左下角。