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 になると思いましたか?

出力画像

4

1 に答える 1

5

これは、カーネルが sRGB 曲線に基づいて色を作成しており、線形値に基づいた色を期待しているためだと考えています。フィルターの出力を次のように変更できます。

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

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

于 2016-06-24T14:35:19.580 に答える