2016-06-24 63 views
1

我正在学习如何编写自定义核心图像过滤器,但在颜色值介于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) 
    } 
} 

输出图像看起来像这样,实际的红色成分值是腌肉nd 190(我使用Photoshop检查颜色值)。对于0.5的值,我认为正确的输出值是255 * 0.5 = 122.5?

the output image

回答

1

我想这是因为内核是基于创建一种sRGB曲线上的颜色,你就基于线性值期待的颜色。您可以将滤镜的输出更改为:

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

纠正输出颜色。顺便说一下,渠道是UInt8,所以值是整数,半红色值是127.