前言
- 一些自帶濾鏡
//磨皮GPUImageBilateralFilter
//綠巨人GPUImageHueFilter
//移行幻影GPUImageLowPassFilter
//懷舊GPUImageMonochromeFilter铣减、GPUImageSepiaFilter
//黑白GPUImageOpeningFilter
//像素GPUImagePixellateFilter
//油畫GPUImagePosterizeFilter俩檬、GPUImageSmoothToonFilter
//素描GPUImageSketchFilter、GPUImageThresholdSketchFilter
//--------------GPUImageSkinToneFilter
//血輪眼GPUImageSwirlFilter
- 支持濾鏡攝像,濾鏡相機(jī)篮灼,濾鏡圖片,濾鏡視頻
// - GPUImageVideoCamera (for live video from an iOS camera)
// - GPUImageStillCamera (for taking photos with the camera)
// - GPUImagePicture (for still images)
// - GPUImageMovie (for movies)
一.使用濾鏡生成UIImage對(duì)象
- 創(chuàng)建一個(gè)濾鏡類
- 使用GPUImagePicture加載濾鏡
- processImage呈現(xiàn)圖像
- useNextFrameForImageCapture持續(xù)圖片呈現(xiàn)(必須要加這句不然會(huì)生成nil)
- imageFromCurrentFramebuffer生成圖片
+ (UIImage *)applySoftEleganceFilter:(UIImage *)image
{
GPUImageSoftEleganceFilter *filter = [[GPUImageSoftEleganceFilter alloc] init];
[filter forceProcessingAtSize:CGSizeMake(image.size.width / 2.0, image.size.height / 2.0)];
GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];
[pic addTarget:filter];
[pic processImage];
[filter useNextFrameForImageCapture];
return [filter imageFromCurrentFramebuffer];
}
濾鏡效果
二.使用濾鏡相機(jī)
- 定義相機(jī)的輸出頁(yè)面
GPUImageView *cameraView = [[GPUImageView alloc] initWithFrame:CGRectMake(0, 44,GBWidth, GBWidth + 145 * GBScale - 44)];
//設(shè)置為水平鏡像徘禁,因?yàn)槟ト耸乔爸米缬眨瑫?huì)有鏡像
[cameraView setInputRotation:kGPUImageFlipHorizonal atIndex:0];
cameraView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill;
[self.view addSubview:cameraView];
self.cameraView = cameraView;
- 定義濾鏡操作對(duì)象
stillCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:@"AVCaptureSessionPresetPhoto" cameraPosition:AVCaptureDevicePositionFront];
stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
- 定義濾鏡需要的對(duì)象
//初始化自己需要的濾鏡
filter = [[GPUImageBilateralFilter alloc] init];
- 添加濾鏡
[stillCamera addTarget:filter];
- 將濾鏡添加到相機(jī)
[filter addTarget:cameraView];
- 開啟濾鏡
[stillCamera startCameraCapture];
- 拍照
GPUImageStillCamera *stillCamera;
GPUImageOutput<GPUImageInput> *filter, *secondFilter, *terminalFilter;
GPUImagePicture *memoryPressurePicture1, *memoryPressurePicture2;
- (void)setupCameraView {
//定義相機(jī)輸出界面
GPUImageView *cameraView = [[GPUImageView alloc] initWithFrame:CGRectMake(0, 44,GBWidth, GBWidth + 145 * GBScale - 44)];
//設(shè)置為水平鏡像,因?yàn)槟ト耸乔爸盟椭欤瑫?huì)有鏡像
[cameraView setInputRotation:kGPUImageFlipHorizonal atIndex:0];
cameraView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill;
[self.view addSubview:cameraView];
self.cameraView = cameraView;
//定義濾鏡操作對(duì)象
stillCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:@"AVCaptureSessionPresetPhoto" cameraPosition:AVCaptureDevicePositionBack];
stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
//定義需要的濾鏡
filter = [[GPUImagePixellateFilter alloc] init];
[stillCamera addTarget:filter];
//濾鏡添加到相機(jī)中
[filter addTarget:cameraView];
//開啟濾鏡
[stillCamera startCameraCapture];
[self.cameraView setInputRotation:kGPUImageFlipHorizonal atIndex:0];
}
三.使用濾鏡錄像
1.創(chuàng)建錄像機(jī)對(duì)象GPUImageVideoCamera
2.創(chuàng)建濾鏡對(duì)象
3.創(chuàng)建視頻的輸出頁(yè)面
4.創(chuàng)建視頻寫入GPUImageMovieWriter
5.添加視頻寫入添加濾鏡
6.開始錄像
7.保存
GPUImageVideoCamera *videoCamera;
GPUImageOutput<GPUImageInput> *filter;
GPUImageMovieWriter *movieWriter;
videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
videoCamera.horizontallyMirrorFrontFacingCamera = NO;
videoCamera.horizontallyMirrorRearFacingCamera = NO;
filter = [[GPUImageSepiaFilter alloc] init];
[videoCamera addTarget:filter];
GPUImageView *filterView = [[GPUImageView alloc] initWithFrame:CGRectMake(0, 44,GBWidth, GBWidth + 145 * GBScale - 44)];
filterView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill;
[self.view addSubview:filterView];
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];
movieWriter.encodingLiveVideo = YES;
[filter addTarget:movieWriter];
[filter addTarget:filterView];
[videoCamera startCameraCapture];
double delayToStartRecording = 0.5;
dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, delayToStartRecording * NSEC_PER_SEC);
dispatch_after(startTime, dispatch_get_main_queue(), ^(void){
NSLog(@"Start recording");
videoCamera.audioEncodingTarget = movieWriter;
[movieWriter startRecording];
double delayInSeconds = 10.0;
dispatch_time_t stopTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(stopTime, dispatch_get_main_queue(), ^(void){
[filter removeTarget:movieWriter];
videoCamera.audioEncodingTarget = nil;
[movieWriter finishRecording];
NSLog(@"Movie completed");
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:movieURL])
{
[library writeVideoAtPathToSavedPhotosAlbum:movieURL completionBlock:^(NSURL *assetURL, NSError *error)
{
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Video Saving Failed"
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Video Saved" message:@"Saved To Photo Album"
delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
});
}];
}
// [videoCamera.inputCamera lockForConfiguration:nil];
// [videoCamera.inputCamera setTorchMode:AVCaptureTorchModeOff];
// [videoCamera.inputCamera unlockForConfiguration];
});
});
Demo下載鏈接:https://pan.baidu.com/s/1miKwbfq