【总结】GPUImage

实现的基本原理

GPUImageStillCamera 照片

GPUImageVideoCamera 视频   ------>    GPUImageFilter    ------>      GPUImageView显示

1.拍摄照片丶视频的时候添加滤镜

//开启前置摄像头640*480
self.videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront];
self.videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
self.videoCamera.horizontallyMirrorFrontFacingCamera = YES;


//用来显示的view
self.filterView = [[GPUImageView alloc] initWithFrame:self.view.frame];
self.filterView.center = self.view.center;
[self.view addSubview:self.filterView];


//开始获取视频
[self.videoCamera startCameraCapture];


//滤镜(此处用的是封装好的一个group)系统提供多种,可以将GPUImageBeautifyFilter更换
GPUImageBeautifyFilter *beautifyFilter = [[GPUImageBeautifyFilter alloc] init];
[self.videoCamera addTarget:beautifyFilter];
[beautifyFilter addTarget:self.filterView];

2.拍摄照片丶视频的时候添加滤镜

-(void)savePhoto{
[self.photoCamera capturePhotoAsJPEGProcessedUpToFilter:self.filterView withCompletionHandler:^(NSData *processedJPEG, NSError *error){
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageDataToSavedPhotosAlbum:processedJPEG metadata:self.photoCamera.currentCaptureMetadata completionBlock:^(NSURL *assetURL, NSError *error2)
{
 if (error2) {
    //错误
  }
else {
     //成功
 }
   }];
  }];
}

3.滤镜视频的保存 GPUImageMovieWriter

NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];

unlink([pathToMovie UTF8String]);

NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];

_movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640.0, 480.0)];

self.videoCamera.audioEncodingTarget = _movieWriter;

_movieWriter.encodingLiveVideo = YES;

[self.videoCamera startCameraCapture];

[_movieWriter startRecording];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[beautifyFilter removeTarget:_movieWriter];

[_movieWriter finishRecording];

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

 if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(pathToMovie)) {
[library writeVideoAtPathToSavedPhotosAlbum:movieURL completionBlock:^(NSURL *assetURL, NSError *error)
{
dispatch_async(dispatch_get_main_queue(), ^{

if (error) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"视频保存失败" message:nil
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"视频保存成功" message:nil
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
});
}];
}
else {
NSLog(@"error mssg)");
}
});

4.添加滤镜

-(void)picture
{
GPUImageView *showView = [[GPUImageView alloc] initWithFrame:self.view.frame];
self.view = showView;
UIImage *inputImage = [UIImage imageNamed:@"1.jpg"];
//_showPicture处理源图片
_showPicture = [[GPUImagePicture alloc] initWithImage:inputImage];
//滤镜
_sepiaFilter = [[GPUImageBeautifyFilter alloc] init];
[_sepiaFilter forceProcessingAtSize:showView.sizeInPixels];
[_showPicture addTarget:_sepiaFilter];
[_sepiaFilter addTarget:showView];
[_showPicture processImage];
}

猜你喜欢

转载自blog.csdn.net/odyyy/article/details/81202179
今日推荐