2017-05-10 3 views
1

画像にフィルタを組み合わせるにはどうすればよいですか?たとえば、CIColorControls、CINoiseReductionなどを使用したいと思います。複数のフィルタを作成して初期化する必要がありますか?それとも別の方法がありますか?フィルタを組み合わせる方法

var colorControls: CIFilter 
var noiseReduction: CIFilter 
... 

func init() { 
    colorControls = CIFilter.init(name: "CIColorControls")! 
    noiseReduction = CIFilter.init(name: "CINoiseReduction")! 
    ... 
} 

答えて

1

あなたはフィルタを一つずつ適用することができます使用

func apply(_ filter: CIFilter?, for image: CIImage) -> CIImage { 
    guard let filter = filter else { return image } 
    filter.setValue(image, forKey: kCIInputImageKey) 
    guard let filteredImage = filter.value(forKey: kCIOutputImageKey) else { return image } 
    return filteredImage 
} 

func filter(image: CIImage) -> CIImage? { 
    guard let colorControls = CIFilter(name: "CIColorControls"), 
      let noiseReduction = CIFilter(name: "CINoiseReduction") else { return nil } 
    colorControls.setValue(image, forKey: kCIInputImageKey) 
    ... // add some CIColorControls filter manipulations 
    guard let imageWithFirstFilter = colorControls.value(forKey: kCIOutputImageKey) as? CIImage else { return nil } 
    noiseReduction.setValue(imageWithFirstFilter, forKey: kCIInputImageKey) 
    ... // add some CINoiseReduction filter manipulations 
    guard let imageWithBothFilters = noiseReduction.value(forKey: kCIOutputImageKey) as? CIImage else { return nil } 
    return imageWithBothFilters 
} 

少し違った方法

image = apply(colorControls, for: image) 
+0

コードがあれば非常に面倒になりますにあり多くのフィルターです。 – nik3212

+0

変更された答えは、 'apply(_ filter、画像用)' func –