我正在尝试使用Apple的CIRowAverage
Core Image
过滤器来计算图像每行的平均值。当我运行过滤器并尝试读出值时,我根本得不到平均值:从我可以知道哪一行有一个值,它返回255并且哪一行没有值(即,所有0),它返回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
答案 0 :(得分:0)
首先,我认为你正确地阅读过滤器所做的事情。我从未使用它(或任何缩小滤镜),但我认为您可能使用一个像素输出错误。
尝试以这种方式渲染输出:
// 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)
您没有发布代码来指明climate.extent
是什么或self
是什么,所以请记住以下事项:
CIContexts
是一件非常昂贵的事情,所以尽量只创建一个。