iOS-美颜相机 by GPUImage

之前网上有个段子说:日本女人靠化妆,韩国女人靠整容,中国女人靠美颜

足以证明相机美颜功能在中国地位是多么高,关于美颜相机的 App 在中国是那么的火

其实美颜相机的实现原理很简单,就是给采集到的图像通过添加滤镜进行渲染


核心代码

创建相机
/**
 sessionPreset:
     swift 3.0 AVCaptureSessionPreset640x480
     swift 4.0 AVCaptureSession.Preset.vga640x480.rawValue
     全屏 AVCaptureSession.Preset.hd1280x720
 cameraPosition:
     设置为前置摄像头
*/
let stillCamera: GPUImageStillCamera = GPUImageStillCamera(sessionPreset: AVCaptureSession.Preset.vga640x480.rawValue, cameraPosition: .front)
// 设置为竖屏
stillCamera.outputImageOrientation =  .portrait

创建预览视图
let showView = GPUImageView(frame: UIScreen.main.bounds)
view.insertSubview(showView, at: 0)

创建滤镜组
// 初始化滤镜组
let filterGroup = GPUImageFilterGroup()

// 初始化滤镜
fileprivate let exposureFilter    = GPUImageExposureFilter()   // 曝光
fileprivate let bilateralFilter   = GPUImageBilateralFilter()  // 磨皮
fileprivate let brightnessFilter  = GPUImageBrightnessFilter() // 美白
fileprivate let satureationFilter = GPUImageSaturationFilter() // 饱和

// 关联滤镜
bilateralFilter.addTarget(brightnessFilter)
brightnessFilter.addTarget(exposureFilter)
exposureFilter.addTarget(satureationFilter)

// 设置滤镜组起点和终点 filter
filterGroup.initialFilters = [bilateralFilter]
filterGroup.terminalFilter = satureationFilter

将滤镜组、预览视图、相机相关联
// 将滤镜组、预览视图、相机相关联
stillCamera?.addTarget(filterGroup)
filterGroup?.addTarget(showView)

启动相机
stillCamera?.startCapture()

旋转摄像头
func rotateCameraAction() {
    stillCamera?.rotateCamera()
}

通过调整四个子滤镜的值,获取最佳美颜效果
// 修改磨皮值
// A normalization factor for the distance between central color and sample color, with a default of 8.0.
// 默认值 8.0
bilateralFilter.distanceNormalizationFactor = CGFloat(sender.value) * 8
// texelSpacingMultiplier: A multiplier for the spacing between texel reads, ranging from 0.0 on up, with a default of 4.0
// 默认值 4.0
bilateralFilter.texelSpacingMultiplier = 4.0


// 修改曝光度
// Exposure ranges from -10.0 to 10.0, with 0.0 as the normal level
// [-10.0, 10.0], 0为默认值
exposureFilter.exposure = CGFloat(sender.value) * 20 - 10

// 修改亮度
// Brightness ranges from -1.0 to 1.0, with 0.0 as the normal level
// [-1.0, 1.0], 0为默认值
brightnessFilter.brightness = CGFloat(sender.value) * 2 - 1

// 修改饱和度
// Saturation ranges from 0.0 (fully desaturated) to 2.0 (max saturation), with 1.0 as the normal level
// [0.0, 2.0], 1.0为默认值
satureationFilter.saturation =  CGFloat(sender.value) * 2

拍摄图片
func captureAction() {
    // 拍摄图片
    stillCamera?.capturePhotoAsImageProcessedUp(toFilter: filterGroup, withCompletionHandler: { (image, error) in
        if let image = image {
            // 将图片存入相册
            UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
        }
    })
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值