我有一个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)
}
这相对较快,但是我试图看看是否有一种方法可以快速获得该颜色。
我记得核心图像具有此自定义的"核心过滤器"内容。
有没有一种方法可以使用自定义核心过滤器获取图像平均颜色的绿色值?
这就是我要做的。(并且实际上是在一个应用程序中进行的,以创建特定尺寸的恒定颜色ciimage。
(1)使用 CIAreaAverage
像您一样使您发出信号像素值。但是,而不是使用绿色频道的输出来创建一个位图(我认为这是您面临的真实问题)....
(2)如果作为CIConstantColorGenerator
的输入,则使用它会创建 infinite 大小的颜色。然后....
(3)使用该输出作为CICrop
的输入,然后将其裁剪到您想要的尺寸。
从本质上讲,您最终获得了您想要的恒定颜色的"大小" ciimage。在下面的代码中,用CIAreaAverage
的绿色通道输出替换我的inputColor
输入,您将获得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
}