視頻濾鏡

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

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

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