2016-06-24 2 views
1

J'apprends comment écrire des filtres d'image de base personnalisés, mais j'ai ce problème lorsque la couleur de rendu n'est pas la même que celle spécifiée dans le code noyau lorsque la valeur de couleur est comprise entre 0 et correct lorsque égal à 0 ou 1.)Problème de couleur du filtre d'image de base personnalisé

Ceci est mon code de filtre:

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

Utilisation:

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

l'image de sortie ressemble à ceci, la valeur de la composante réelle rouge est Arou sd 190 (J'ai vérifié la valeur de couleur en utilisant Photoshop). Pour une valeur de 0,5 j'ai pensé que la valeur de sortie correcte serait 255 * 0.5 = 122.5?

the output image

Répondre

1

Je pense cela est parce que le noyau crée des couleurs sur la base d'une courbe sRGB et vous attendent des couleurs en fonction des valeurs linéaires. Vous pouvez modifier la sortie de votre filtre sur:

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

pour corriger la couleur de sortie. Soit dit en passant, les canaux sont UInt8, donc les valeurs sont des entiers et la valeur demi-rouge est 127.