2016-06-24 102 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.