自定义 Core Image 滤镜颜色问题

3

我正在学习如何编写自定义的Core Image滤镜,但是当颜色值在0-1之间时,在内核代码中指定的渲染颜色与实际颜色不同。(当颜色等于0或1时,颜色是正确的。)

这是我的滤镜代码:

import UIKit
class testFilter: CIFilter
{   
    // simply return half red color (0.5)

    var colorKernel = CIColorKernel(string:
        "kernel vec4 theFilter()" +
        "{ return vec4(0.5, 0.0, 0.0, 1.0); }"
    )

    override var outputImage: CIImage!
    { 
        let rect = CGRect(x: 0, y: 0, width: 200, height: 100)
        return colorKernel.applyWithExtent(rect,arguments: nil)
    }
}

使用方法:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // generate image
        let filter = testFilter()
        let ciImage = f.outputImage      
        let image = UIImage(CIImage: ciImage) 

        // add to view
        let v = UIImageView(frame: CGRect(x: 50, y: 50, width: 200, height: 100))
        v.image = image     
        view.addSubview(v)
    }
}

输出图像如下,实际红色分量值约为190(我使用Photoshop检查了颜色值)。对于0.5的值,我认为正确的输出值应该是255 * 0.5 = 122.5?
1个回答

5

我认为这是因为内核基于sRGB曲线创建颜色,而您期望基于线性值创建颜色。您可以将过滤器的输出更改为:

return colorKernel!.applyWithExtent(rect, arguments: nil)?
                   .imageByApplyingFilter("CISRGBToneCurveToLinear", withInputParameters: nil)

为了纠正输出颜色。顺便提一下,这些通道都是UInt8类型,因此数值是整数,半个红色的值是127。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接