2017-06-15 9 views
0

カスタムCIFilterを作成しようとしています。これまでのところ、このフィルターはイメージを明るくしています。私が実際に望むものではありませんが、私はそれを動作させることができるかどうかを確認するためにそれをやっています。フィルターはinputBlurRadiusの設定値で動作しますが、ユーザーが値を変更できるようにフィルターを変更する方法はわかりません。ここにカスタムフィルタがあります。私はそれを使用するファイルでカスタムCIFilterの入力キーを変更するにはどうすればよいですか?

import Foundation 
import UIKit 

public class CustomFilter: CIFilter { 
    var inputImage: CIImage? 
    private var kernel: CIColorKernel! 
    var inputBrightness: CGFloat = 0.4 

override public var outputImage: CIImage! 
{ 
    guard let inputImage = inputImage 
     else 
    { 
     return nil 
    } 

    let extent = inputImage.extent 

    let blur = createCustomKernel4().apply(
     withExtent: inputImage.extent, 
     roiCallback: 
     { 
      (index, rect) in 
      return rect 
    }, 
     arguments: [inputImage, inputBrightness as AnyObject]) 

    return blur!.cropping(to: extent) 
} 

func createCustomKernel4() -> CIColorKernel { 
    let kernelString = 
     "kernel vec4 brightenEffect (sampler src , float k) { \n " + 
      " vec4 currentSource = sample (src, samplerCoord (src));" + 
      "currentSource.rgb = currentSource.rgb + k * currentSource.a;" + 
      "return currentSource; \n " + 
    "}" 
    return CIColorKernel(string: kernelString)! 
    //brigtens an image 
} 
} 


class CustomFiltersVendor: NSObject, CIFilterConstructor 
{ 
    static func registerFilters() 
    { 
    CIFilter.registerName(
     "CustomFilter", 
     constructor: CustomFiltersVendor(), 
     classAttributes: [ 
      kCIAttributeFilterCategories: ["CustomFilters"] 
     ]) 
} 

func filter(withName name: String) -> CIFilter? 
{ 
    switch name 
    { 
    case "CustomFilter": 
     return CustomFilter() 

    default: 
     return nil 
    } 
} 
} 

、私は

let filter3 = CustomFilter() 
filter3.setValue(coreImage, forKey: kCIInputImageKey) 
filter3.inputKeys 
let outputImage = filter3.outputImage! 

を持っている私はinputKeysでinputBrightnessを参照してください、私はそれを修正する方法が分かりませんか?どうすればいい?

答えて

0

最後に、私はこの質問に遭遇しました。もしそうでなければ、サブクラスCIFilterをサブクラスにします。

カーネルコードは、float kの値を渡すことを意味します。 inputBrightnessFactorとしたいとします。ここでは、あなたのサブクラスで必要なものです:ノートの

class CustomFilter:CIFilter { 

    let kernel = CIColorKernel(source: 
     "kernel vec4 brightenEffect (sampler src , float k) { \n " + 
      "vec4 currentSource = sample (src, samplerCoord (src));" + 
      "currentSource.rgb = currentSource.rgb + k * currentSource.a;" + 
      "return currentSource; \n " + 
     "}") 
    var inputImage:CIImage! 
    var inputBrightnessFactor:Float = 1 

    override var attributes: [String : Any] { 
     return [ 
      kCIAttributeFilterDisplayName: "My Custom Filter", 

      "inputImage": [kCIAttributeIdentity: 0, 
          kCIAttributeClass: "CIImage", 
          kCIAttributeDisplayName: "Image", 
          kCIAttributeType: kCIAttributeTypeImage], 

      "inputBrightnessFactor": [kCIAttributeIdentity: 0, 
             kCIAttributeClass: "NSNumber", 
             kCIAttributeDisplayName: "Brightness Factor", 
             kCIAttributeDefault: 0, 
             kCIAttributeMin: 0, 
             kCIAttributeSliderMin: 0, 
             kCIAttributeSliderMax: 1, 
             kCIAttributeType: kCIAttributeTypeScalar] 
     ] 
    } 

    override init() { 
     super.init() 
    } 

    override func setValue(_ value: Any?, forKey key: String) { 
     switch key { 
      case "inputImage": 
       inputImage = value as! CIImage 
      case "inputBrightnessFactor": 
       inputBrightnessFactor = value as! Float 
      default: 
       break 
     } 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override var outputImage: CIImage { 
     return kernel!.apply(extent: inputImage.extent, arguments: [inputImage as Any, inputBrightnessFactor as Any])! 
    } 
} 

2つの重要なもの:

  • あなたはフィルタと属性の表示値を登録し、属性に彼らのデフォルト値を与えることattributesをオーバーライドします。
  • setValue(forKey:)を上書きして、他のフィルタと同じように使用できます。

使い方(あなたが最初CustomFilters.registerFilters()を実行することを確認してください):あなたは今、他のCIFilterのようなあなたのカーネルを扱う

let myFactor:Float = 0.4 
let filter = CIFilter(name: "CustomFilter") 
filter.setValue(inputImage, forKey: kCIInputImageKey) 
filter.setValue(myFactor, forKey: "inputBrightnessFactor") 
let myOutputImage = filter?.outputImage 

注意。

うまくいけば、すでにうまく機能しているはずですが、そうでなければ、それを行うべきです。

+0

私はそれを稼働させましたが、解決策を書くことに感謝します! – Jade

関連する問題