2017-04-10 99 views
2

如何爲照片添加多種效果?我有以下代碼,增加了一張照片的效果:爲照片添加多種效果

func applyEffects(name: String, n: Float) { 
    filter.setValue(self.cImage, forKeyPath: kCIInputImageKey) 
    filter.setValue(n, forKeyPath: name) 

    let result = filter.value(forKey: kCIOutputImageKey) as! CIImage 
    let cgImage = CIContext.init(options: nil).createCGImage(result, from: result.extent) 

    self.customImage = UIImage.init(cgImage: cgImage!) 
} 

func brightness(n: Float) { 
    self.applyEffects(name: kCIInputBrightnessKey, n: n) 
} 

func contrast(n: Float) { 
    self.applyEffects(name: kCIInputContrastKey, n: n) 
} 

func saturation(n: Float) { 
    self.applyEffects(name: kCIInputSaturationKey, n: n) 
} 

但是,當我想應用第二個效果,第一個消失。我如何疊加兩個或更多的效果?

回答

5

我假設您使用CIColorControls作爲您的過濾器。

你需要三個值傳遞到您的來電:

// The documentation doesn't give a default value for contrast, but for the others, I'm setting the defaults 

var brightness:Float = 1 
var contrast:Float = 1 
var saturation:Float = 1 


func applyEffects() { 

    filter.setValue(self.cImage, forKeyPath: kCIInputImageKey) 
    filter.setValue(brightness, forKeyPath: kCIInputBrightnessKey) 
    filter.setValue(contrast, forKeyPath: kCIInputContrastKey) 
    filter.setValue(saturation, forKeyPath: kCIInputSaturationKey) 

    let result = filter.value(forKey: kCIOutputImageKey) as! CIImage 
    let cgImage = CIContext.init(options: nil).createCGImage(result, from: result.extent) 

    self.customImage = UIImage.init(cgImage: cgImage!) 

} 

func brightness(n: Float) { 
    brightness = n 
    applyEffects() 
} 

func contrast(n: Float) { 
    contrast = n 
    applyEffects() 
} 

func saturation(n: Float) { 
    saturation = n 
    applyEffects() 
} 

一個建議:

如果你試圖使用「實時」通過UISliders更新,使用GLKView和直接發送CIImage。它使用GPU,並且設備上的性能大大提高。您始終可以創建UIImage以進行保存,發送消息等。

+0

謝謝。我可以在UIViewController中使用GLKView嗎? – nik3212

+0

我這樣做。 GLKViews是UIView的一個子類。 https://www.objc.io/issues/21-camera-and-photos/core-image-intro/ CoreImage上的這篇文章的頂部是指向使用它的GitHub的鏈接。大約一半(使用OpenGL提高性能)對於如何使用它來說是一個很好的解釋。 – dfd