【问题标题】:Which CIFilter can add a color layer to image哪个 CIFilter 可以为图像添加颜色层
【发布时间】:2018-02-12 13:47:51
【问题描述】:

例如:

这是原图

这是 50% alpha 颜色层

合并两张图片可以得到结果

哪个 CIFilter 可以完成这项任务?


更新:

我在这里找到了一个 CIColorCube 示例。

https://github.com/rnsm504/CIColorCube/blob/master/CIColorCubeSample/ViewController.swift

我用这个例子来写我的颜色过滤器

var hue : Float = 0.1
func RGBtoHSV(_ r : Float, g : Float, b : Float) -> (h : Float, s : Float, v : Float) {
    var h : CGFloat = 0
    var s : CGFloat = 0
    var v : CGFloat = 0
    let col = UIColor(red: CGFloat(r), green: CGFloat(g), blue: CGFloat(b), alpha: 1.0)
    col.getHue(&h, saturation: &s, brightness: &v, alpha: nil)
    return (Float(h), Float(s), Float(v))
}

func HSVtoRGB(_ h : Float, s : Float, v : Float) -> (r : Float, g : Float, b : Float) {
    var r : Float = 128
    var g : Float = 0
    var b : Float = 0
    let C = s * v
    let HS = h * 6.0
    let X = C * (1.0 - fabsf(fmodf(HS, 2.0) - 1.0))
    if (HS >= 0 && HS < 1) {
        r = C
        g = X
        b = 0
    } else if (HS >= 1 && HS < 2) {
        r = X
        g = C
        b = 0
    } else if (HS >= 2 && HS < 3) {
        r = 0
        g = C
        b = X
    } else if (HS >= 3 && HS < 4) {
        r = 0
        g = X
        b = C
    } else if (HS >= 4 && HS < 5) {
        r = X
        g = 0
        b = C
    } else if (HS >= 5 && HS < 6) {
        r = C
        g = 0
        b = X
    }
    let m = v - C
    r += m
    g += m
    b += m
    return (r, g, b)
}

func filter() -> CIFilter {

    let size = 64
    let defaultHue: Float = 0 //default color of blue truck
    let hueRange: Float = 60 //hue angle that we want to replace

    let centerHueAngle: Float = defaultHue/360.0
    var destCenterHueAngle: Float = hue
    let minHueAngle: Float = (defaultHue - hueRange/2.0) / 360
    let maxHueAngle: Float = (defaultHue + hueRange/2.0) / 360
    let hueAdjustment = centerHueAngle - destCenterHueAngle
    if destCenterHueAngle == 0  {
        destCenterHueAngle = 1 //force red if slider angle is 0
    }

    var cubeData = [Float](repeating: 0, count: (size * size * size * 4))
    var offset = 0
    var x : Float = 0, y : Float = 0, z : Float = 0, a :Float = 1.0

    for b in 0..<size {
        x = Float(b)/Float(size)
        for g in 0..<size {
            y = Float(g)/Float(size)
            for r in 0..<size {
                z = Float(r)/Float(size)
                var hsv = RGBtoHSV(z, g: y, b: x)

                if (hsv.h > minHueAngle && hsv.h < maxHueAngle) {
                    hsv.h = destCenterHueAngle == 1 ? 0 : hsv.h - hueAdjustment //force red if slider angle is 360
                    let newRgb = HSVtoRGB(hsv.h, s:hsv.s, v:hsv.v)

                    cubeData[offset] = newRgb.r
                    cubeData[offset+1] = newRgb.g
                    cubeData[offset+2] = newRgb.b
                } else {
                    cubeData[offset] = z
                    cubeData[offset+1] = y
                    cubeData[offset+2] = x
                }
                cubeData[offset+3] =  a
                offset += 4
            }
        }
    }

    let b = cubeData.withUnsafeBufferPointer{ Data(buffer:$0) }
    let data = b as NSData
    let colorCube = CIFilter(name: "CIColorCube", withInputParameters: ["inputCubeDimension": size, "inputCubeData" : data])
    return colorCube!
}

区别就在这里,我在滤镜里加了更多的红色

var r : Float = 128

这就是我使用滤镜的方式,但是这个滤镜会去除图像中的所有红色,这是我应该更改以添加更多红色的正确变量吗?

@IBOutlet weak var inputImg: UIImageView!
@IBOutlet weak var outputImg: UIImageView!



@IBAction func clickButton(_ sender: Any) {
    let img = inputImg.image
    outputImg.image = img


    addColor(img: &outputImg.image!)

}


func addColor(img : inout UIImage){
    let beginImage = CIImage(image: img)
    let cifilter = filter()
    cifilter.setValue(beginImage, forKey: kCIInputImageKey)

    var ciimg = cifilter.outputImage
    let context:CIContext = CIContext.init(options: nil)
    let cgImage:CGImage = context.createCGImage(ciimg!, from: ciimg!.extent)!
    let newImage = UIImage(cgImage: cgImage)
    img = newImage
}

更新 2

终于找到答案了

我应该使用CIConstantColorGeneratorCISourceOverCompositing

CIColorCube 将替换颜色

这里是彩色滤镜的正确实现

func createOverlay() -> CIImage {
    let overlayColor = UIColor.red.withAlphaComponent(0.5)
    let c = CIColor(color: overlayColor)
    let parameters = [kCIInputColorKey: c]
    guard let filter = CIFilter(name: "CIConstantColorGenerator", withInputParameters: parameters) else {
        fatalError()
    }
    guard let overlay = filter.outputImage else { fatalError() }
    return overlay
}

func compositeSourceOver(img: CIImage, overlay:CIImage) -> CIImage {

    let parameters = [
        kCIInputBackgroundImageKey: img,
        kCIInputImageKey: overlay
    ]
    guard let filter = CIFilter(name: "CISourceOverCompositing", withInputParameters: parameters) else {
        fatalError()
    }
    guard let outputImage = filter.outputImage else { fatalError() }
    let cropRect = img.extent
    return outputImage.cropped(to: cropRect)
}

【问题讨论】:

    标签: ios cifilter


    【解决方案1】:

    应用CIColorCube 过滤器。

    来自 docs 的 result 看起来很相似。

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 2010-12-01
      • 2010-12-02
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多