關(guān)于GPUImage之美顏相機(jī)

iOS GPUImage 美顏相機(jī)


GPUImage是一個(gè)強(qiáng)大的圖像處理庫,其中美顏相機(jī),可以讓我們實(shí)現(xiàn)自定義美顏拍照功能,這里只說拍照功能的實(shí)現(xiàn)。

實(shí)現(xiàn)思路:

  • GPUImage封裝了AVFoundation相機(jī)API,所以它擁有拍照和拍攝視頻的功能,即GPUImageStillCamera
  • GPUImage提供了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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容