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

问题描述 投票:0回答:1

我有一个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有这个自定义的“核心过滤器”的东西。

有没有办法使用自定义核心过滤器获取图像平均颜色的绿色值?

ios core-image cifilter
1个回答
3
投票

这就是我要做的。 (实际上在一个应用程序中创建一个特定大小的恒定颜色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
}
© www.soinside.com 2019 - 2024. All rights reserved.