gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:36:39 27 4
gpt4 key购买 nike

我有一个 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让您像您正在做的那样发出信号像素值。但不是使用绿色 channel 的输出来创建位图(我相信这是您面临的真正问题)......

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

(3) 将该输出用作CICrop 的输入。并将其裁剪为您想要的尺寸。

本质上,您最终会得到一个“大小”的 CIImage,它具有任何您想要的恒定颜色。在下面的代码中,将我的输入替换为 inputColor绿色 channel 输出为 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
}

关于ios - CIImage 的平均颜色...更快的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54818120/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com