2017-11-22 12 views
0

イメージを扱うアプリケーションを作成しましたが、問題が発生しました。写真にフィルターを追加することはできません。この問題の解決方法はわかりません。CIImageにフィルタを追加する

私はCIImageとの仕事のために自分のクラスを書いた:

import CoreImage 

typealias Filter = (CIImage) ->() 
typealias ParametersFilter = Dictionary<String, AnyObject> 

public protocol PXImageDelegate { 
    func updateImage(picker: PXImage) 
} 

public class PXImage: CIImage { 

public var delegate: PXImageDelegate? 

open var brightness: Float = 0 { 
    willSet (value) { 
     brightness = value 
     brightness(value)(self) 
     updateImage() 
    } 
} 

open var contrast: Float = 1 { 
    willSet (value) { 
     contrast = value 
     contrast(value)(self) 
     updateImage() 
    } 
} 

open var saturation: Float = 1 { 
    willSet (value) { 
     saturation = value 
     saturation(value)(self) 
     updateImage() 
    } 
} 

private func brightness(_ value: Float) -> Filter { 
    return { image in 
     let parameters: ParametersFilter = [ 
      kCIInputBrightnessKey: value as AnyObject, 
      kCIInputImageKey: image 
     ] 

     self.applyingFilter("CIColorControls", parameters: parameters) 
    } 
} 

private func contrast(_ value: Float) -> Filter { 
    return { image in 
     let parameters: ParametersFilter = [ 
      kCIInputContrastKey: value as AnyObject, 
      kCIInputImageKey: image 
     ] 

     self.applyingFilter("CIColorControls", parameters: parameters) 
    } 
} 

private func saturation(_ value: Float) -> Filter { 
    return { image in 
     let parameters: ParametersFilter = [ 
      kCIInputSaturationKey: value as AnyObject, 
      kCIInputImageKey: image 
     ] 

     self.applyingFilter("CIColorControls", parameters: parameters) 
    } 
} 

func updateImage() { 
    delegate?.updateImage(picker: self) 
} 

しかし、私は明るさの値を変更したときに、コントラスト、彩度何も起こりません。画像は静的なままです。なぜこうなった?

答えて

1

まず、CIImage.applyingFilterのメソッドシグネチャを見てください。それは突然変異の方法ではありません。新しいCIImageを返します。次に、CIImageが動作する方法は、基本的に画像を保存すること+フィルタのシェーダの指示です。暗黙のうちに(例えば、UIImageに変換することによって)明示的にCIContextを作成するまで、実際にシェーダをコンパイルして実行するわけではありません。あなたがコードを見ることができないので、あなたがこれをしているかどうかはわかりません。いずれの場合でも、あなたのパラメータによって入力が制御される一連のフィルタが必要です。パラメータが変更されたときにフィルタを再評価するだけです。

+0

ありがとうございました。私はこのイメージをCIContextを使ってGLKViewの中に描画しています。 – nik3212

関連する問題