GPUImage原生美顏
GPUImage原生美顏
步驟一:使用Cocoapods導(dǎo)入GPUImage
步驟二:創(chuàng)建視頻源GPUImageVideoCamera
步驟三:創(chuàng)建最終目的源:GPUImageView
步驟四:創(chuàng)建濾鏡組(GPUImageFilterGroup),需要組合亮度(GPUImageBrightnessFilter)和雙邊濾波(GPUImageBilateralFilter)這兩個濾鏡達到美顏效果.
步驟五:設(shè)置濾鏡組鏈
步驟六:設(shè)置GPUImage處理鏈,從數(shù)據(jù)源 => 濾鏡 => 最終界面效果
步驟七:開始采集視頻
注意點:
SessionPreset最好使用AVCaptureSessionPresetHigh,會自動識別,如果用太高分辨率,當(dāng)前設(shè)備不支持會直接報錯
GPUImageVideoCamera必須要強引用,否則會被銷毀,不能持續(xù)采集視頻.
必須調(diào)用startCameraCapture,底層才會把采集到的視頻源,渲染到GPUImageView中,就能顯示了。
GPUImageBilateralFilter的distanceNormalizationFactor值越小,磨皮效果越好,distanceNormalizationFactor取值范圍: 大于1。
#import "ViewController.h"
#import <GPUImage.h>
@interface ViewController ()
@property (nonatomic,strong)GPUImageVideoCamera * videoCamera;
@property (nonatomic,strong)GPUImageBilateralFilter * bilateralFilter;
@property (nonatomic,strong)GPUImageBrightnessFilter * brightnessFilter;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
GPUImageVideoCamera * videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPresetHigh cameraPosition:AVCaptureDevicePositionBack];
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
self.videoCamera = videoCamera;
GPUImageView * GPUImg = [[GPUImageView alloc] initWithFrame:self.view.bounds];
[self.view insertSubview:GPUImg atIndex:0];
//創(chuàng)建過濾:磨皮,美白,組合濾鏡
GPUImageFilterGroup * groupFiler = [[GPUImageFilterGroup alloc] init];
GPUImageBilateralFilter * bilateralFilter = [[GPUImageBilateralFilter alloc] init];
self.bilateralFilter = bilateralFilter;
GPUImageBrightnessFilter * brightnessFilter =[[GPUImageBrightnessFilter alloc] init];
self.brightnessFilter = brightnessFilter;
[groupFiler addTarget:bilateralFilter];
[groupFiler addFilter:brightnessFilter];
//設(shè)置濾鏡組鏈
[self.bilateralFilter addTarget:brightnessFilter];
[groupFiler setInitialFilters:@[self.bilateralFilter]];
groupFiler.terminalFilter = brightnessFilter;
//設(shè)置GPUImage響應(yīng)鏈,從數(shù)據(jù)源--》過濾--》最終界面
[self.videoCamera addTarget:groupFiler];
[groupFiler addTarget:GPUImg];
//開始采集視頻
[self.videoCamera startCameraCapture];
}
利用美顏濾鏡實現(xiàn)
步驟一:使用Cocoapods導(dǎo)入GPUImage
步驟二:導(dǎo)入GPUImageBeautifyFilter文件夾
步驟三:創(chuàng)建視頻源GPUImageVideoCamera
步驟四:創(chuàng)建最終目的源:GPUImageView
步驟五:創(chuàng)建最終美顏濾鏡:GPUImageBeautifyFilter
步驟六:設(shè)置GPUImage處理鏈,從數(shù)據(jù)源 => 濾鏡 => 最終界面效果
注意:
切換美顏效果原理:移除之前所有處理鏈,重新設(shè)置處理鏈
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// 創(chuàng)建視頻源
// SessionPreset:屏幕分辨率,AVCaptureSessionPresetHigh會自適應(yīng)高分辨率
// cameraPosition:攝像頭方向
GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPresetHigh cameraPosition:AVCaptureDevicePositionFront];
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
_videoCamera = videoCamera;
// 創(chuàng)建最終預(yù)覽View
GPUImageView *captureVideoPreview = [[GPUImageView alloc] initWithFrame:self.view.bounds];
[self.view insertSubview:captureVideoPreview atIndex:0];
_captureVideoPreview = captureVideoPreview;
// 設(shè)置處理鏈
[_videoCamera addTarget:_captureVideoPreview];
// 必須調(diào)用startCameraCapture,底層才會把采集到的視頻源,渲染到GPUImageView中,就能顯示了。
// 開始采集視頻
[videoCamera startCameraCapture];
}
- (IBAction)openBeautifyFilter:(UISwitch *)sender {
// 切換美顏效果原理:移除之前所有處理鏈,重新設(shè)置處理鏈
if (sender.on) {
// 移除之前所有處理鏈
[_videoCamera removeAllTargets];
// 創(chuàng)建美顏濾鏡
GPUImageBeautifyFilter *beautifyFilter = [[GPUImageBeautifyFilter alloc] init];
// 設(shè)置GPUImage處理鏈,從數(shù)據(jù)源 => 濾鏡 => 最終界面效果
[_videoCamera addTarget:beautifyFilter];
[beautifyFilter addTarget:_captureVideoPreview];
} else {
// 移除之前所有處理鏈
[_videoCamera removeAllTargets];
[_videoCamera addTarget:_captureVideoPreview];
}
}
iOS10閃退 崩潰 This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.
<key>NSCameraUsageDescription</key>
<string>cameraDesciption</string>
<key>NSContactsUsageDescription</key>
<string>contactsDesciption</string>
<key>NSMicrophoneUsageDescription</key>
<string>microphoneDesciption</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>photoLibraryDesciption</string>