2016-06-24 20 views
1

Ich lerne, wie benutzerdefinierte Core Image Filter schreiben, aber dieses Problem, wo die gerenderte Farbe ist nicht das gleiche wie im Kernel-Code angegeben, wenn der Farbwert zwischen 0 - 1 ist. (Farbe ist richtig, wenn gleich 0 oder 1)Benutzerdefinierte Core Image Filter Farbproblem

das ist mein Filtercode ist:

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) 
    } 
} 

Verbrauch:

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) 
    } 
} 

das Ausgangsbild wie diese, die tatsächliche Rotanteil Wert aussieht, ist arou nd 190 (Ich habe den Farbwert mit Photoshop überprüft). Für einen Wert von 0,5 dachte ich, der korrekte Ausgabewert wäre 255 * 0,5 = 122,5?

the output image

Antwort

1

ich das denke, da der Kernel Farben basierend auf einem sRGB-Kurve zu schaffen und Sie erwarten Farben auf Basis linearer Werte. Sie können die Ausgabe Ihres Filters wie folgt ändern:

, um die Ausgabefarbe zu korrigieren. Übrigens sind die Kanäle UInt8, also sind die Werte ganze Zahlen und der halbe rote Wert ist 127.