iOS GPUImage 美顏相機(jī)
GPUImage是一個(gè)強(qiáng)大的圖像處理庫,其中美顏相機(jī),可以讓我們實(shí)現(xiàn)自定義美顏拍照功能,這里只說拍照功能的實(shí)現(xiàn)。
實(shí)現(xiàn)思路:
GPUImage封裝了AVFoundation相機(jī)API,所以它擁有拍照和拍攝視頻的功能,即GPUImageStillCameraGPUImage提供了125種濾鏡,其中有曝光、磨皮、美白、飽和度這些實(shí)用濾鏡,那么我們把這些濾鏡使用addTarget()函數(shù)加入到相機(jī)中,是否能夠?qū)崿F(xiàn)美顏相機(jī)呢?
首先創(chuàng)建相機(jī),創(chuàng)建濾鏡屬性:
/// 相機(jī)
fileprivate var camera: GPUImageStillCamera!
fileprivate var isFirst: Bool = true
/// 美白-1 ~ 1
fileprivate var brughtnessFilter: GPUImageBrightnessFilter!
/// 磨皮
fileprivate var bilateralFilter: GPUImageBilateralFilter!
/// 曝光-10 ~ 10
fileprivate var exposureFilter: GPUImageExposureFilter!
/// 飽和
fileprivate var saturationFilter: GPUImageSaturationFilter!
/// 濾鏡組
fileprivate var filterGroup: GPUImageFilterGroup!
設(shè)置相機(jī),設(shè)置濾鏡,開始掃描拍照:
@IBAction func startCapturing(_ sender: UIButton) {
if isFirst {
// 1. 創(chuàng)建GPUImage中的相機(jī)
let camera = GPUImageStillCamera(sessionPreset: AVCaptureSessionPresetHigh, cameraPosition: .front)
camera?.outputImageOrientation = .portrait
self.camera = camera
// 2. 添加濾鏡
filterGroup = GPUImageFilterGroup()
let brughtnessFilter = GPUImageBrightnessFilter()
brughtnessFilter.brightness = 0.2
self.brughtnessFilter = brughtnessFilter
let bilateralFilter = GPUImageBilateralFilter()
bilateralFilter.distanceNormalizationFactor = 5
self.bilateralFilter = bilateralFilter
let exposureFilter = GPUImageExposureFilter()
exposureFilter.exposure = 0
self.exposureFilter = exposureFilter
let saturationFilter = GPUImageSaturationFilter()
saturationFilter.saturation = 1
self.saturationFilter = saturationFilter
// 設(shè)置濾鏡關(guān)系
brughtnessFilter.addTarget(bilateralFilter)
bilateralFilter.addTarget(exposureFilter)
exposureFilter.addTarget(saturationFilter)
filterGroup.initialFilters = [brughtnessFilter]
filterGroup.terminalFilter = saturationFilter
camera?.addTarget(filterGroup)
// 3. 創(chuàng)建GPUImageView
let gpu_ImageView = GPUImageView(frame: view.bounds)
view.insertSubview(gpu_ImageView, at: 0)
filterGroup.addTarget(gpu_ImageView)
isFirst = false
}
// 4. 開始采集
camera?.startCapture()
}
GPUImageFilterGroup是一個(gè)關(guān)聯(lián)濾鏡的濾鏡組,其父類為GPUImageOutput,在掃描預(yù)覽時(shí)需要加入GPUImageView對象。
有了掃描獲取圖像,那么就需要拍攝功能:
@IBAction func takePhoto(_ sender: UIButton) {
camera.capturePhotoAsImageProcessedUp(toFilter: filterGroup) { (image: UIImage?, error: Error?) in
guard let image = image else {
return
}
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}
}
拍攝獲取當(dāng)前掃描畫面,傳入的是一個(gè)濾鏡,但想要加入前面多個(gè)濾鏡,那么就只能傳入GPUImageFilterGroup,獲取到圖片,寫入相冊!
停止掃描:
@IBAction func stopCapturing(_ sender: UIButton) {
camera.stopCapture()
}
切換攝像頭:
@IBAction func rotateCamera(_ sender: UIButton) {
camera.rotateCamera()
}
除了掃描之外,其他3個(gè)功能幾乎用一行代碼就可以搞定。如此,就可以實(shí)現(xiàn)了我們美顏相機(jī)功能,當(dāng)然,上面代碼中各濾鏡的相關(guān)數(shù)值都是固定死的,要想加強(qiáng)美顏程度,可以額外添加控件來調(diào)節(jié),從而改變美顏效果,如用UISlider。