2016-06-24 3 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) 
    } 
} 

出力画像はこのようになり、実際の赤成分値がarouありますnd 190(私はPhotoshopを使って色の値をチェックしました)。値が0.5の場合、正しい出力値は255 * 0.5 = 122.5となるでしょうか?カーネルがsRGBカーブに基づいて色を作成されていて、線形値に基づいて色を期待しているので、私はこのことを考えている

the output image

答えて

1

です。フィルタの出力を次のように変更することができます。

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

出力色を修正します。ちなみに、チャンネルはUInt8なので、値は整数で、半分の赤の値は127です。

関連する問題