我有一个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有这个自定义的“核心过滤器”的东西。
有没有办法使用自定义核心过滤器获取图像平均颜色的绿色值?
这就是我要做的。 (实际上在一个应用程序中创建一个特定大小的恒定颜色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
}