CIImage的平均颜色...更快的方法

时间:2019-02-22 00:06:49

标签: ios core-image cifilter

我有一个258x258的CIImage。我对其应用了滤镜CIAreaAverage,以获得该图像的平均颜色的绿色值。

我正在使用此功能来获取...

// channel 0,1,2 = red, green, blue
func averageColorOfImage (_ inputImage: CIImage, _ channel: Int) -> Double {

  let extentVector = CIVector(x: inputImage.extent.origin.x, y: inputImage.extent.origin.y, z: inputImage.extent.size.width, w: inputImage.extent.size.height)

  guard let filter = CIFilter(name: "CIAreaAverage", parameters: [kCIInputImageKey: inputImage, kCIInputExtentKey: extentVector]) else { return 0 }
  guard let outputImage = Static.filter!.outputImage else { return 0 }

  var bitmap = [UInt8](repeating: 0, count: 4)
  let context = CIContext(options: [.workingColorSpace: kCFNull])
  context.render(outputImage, toBitmap: &bitmap, rowBytes: 4, bounds: CGRect(x: 0, y: 0, width: 1, height: 1), format: .RGBA8, colorSpace: nil)

  return Double(bitmap[channel]) / Double(255)
}

运行速度相对较快,但我正在尝试查看是否有一种方法可以快速获得该颜色。

我记得Core Image有这个自定义的“核心过滤器”内容。

是否有一种方法可以使用自定义核心滤镜获取图像平均颜色的绿色值?

1 个答案:

答案 0 :(得分:0)

这就是我要做的。 (实际上是在一个应用中执行以创建特定大小的恒定颜色CIImage。

(1)使用CIAreaAverage来获取信号像素值,就像您所做的一样。但是不要使用绿色通道的输出来创建位图(我相信这是您面临的真正问题)。...

(2)使用if作为CIConstantColorGenerator的输入,这将创建无限大小的颜色。然后...

(3)使用该输出作为CICrop的输入,并将其裁剪为所需的尺寸。

从根本上来说,您最终得到的是恒定大小的“大小” CIImage,无论您想要什么颜色。在下面的代码中,将我对inputColor的输入替换为CIAreaAverage的绿色通道输出,您将获得640x640的CIImage。

func createNewPalette() {
    let filter = CIFilter(name: "CIConstantColorGenerator")
    filter?.setValue(CIColor(red: 0.7, green: 0.4, blue: 0.4), forKey: "inputColor")
    ciPalette = filter?.outputImage
    let crop = CIFilter(name: "CICrop")
    crop?.setValue(ciPalette, forKey: "inputImage")
    crop?.setValue(CIVector(x: 0, y: 0, z: 640, w: 640), forKey: "inputRectangle")
    ciPaletteOriginal = crop?.outputImage
}