使用GPUImage實現(xiàn)簡單的視頻丶相機的濾鏡是非常簡單的,實現(xiàn)的基本原理是GPUImageStillCamera/GPUImageVideoCamera(照片/視頻)捕獲圖像->GPUImageFilter濾鏡->GPUImageView顯示.
1.拍攝照片丶視頻的時候添加濾鏡
在拍攝視頻和照片的時候可以添加單個或者一個Group濾鏡
//開啟前置攝像頭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)系統(tǒng)提供多種,可以將GPUImageBeautifyFilter更換
GPUImageBeautifyFilter *beautifyFilter = [[GPUImageBeautifyFilter alloc] init];
[self.videoCamera addTarget:beautifyFilter];
[beautifyFilter addTarget:self.filterView];
拍攝照片的時候用到GPUImageStillCamera代替GPUImageVideoCamera.兩個均是GPUImageOutput的子類,用來作為數(shù)據(jù)源.
拍攝照片并且保存圖片(AssetsLibrary/AssetsLibrary.h框架IOS9以后推出PhotoKit框架)
-(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 {
//成功
}
}];
}];
}
濾鏡視頻的保存用的是GPUImageMovieWriter類(參考落影l(fā)oyinglin視頻保存方式)
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)");
}
});
注:移除濾鏡
[self.videoCamera removeAllTargets];
[self.videoCamera addTarget:self.filterView];
2.給靜態(tài)圖片添加濾鏡
用GPUImagePicture處理源圖像->添加GPUImageFilter濾鏡->GPUImageView顯示.
-(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];
}
3.混合濾鏡兩種方式
1.直接添加多個濾鏡
GPUImagePicture *finalyOne = [[GPUImagePicture alloc]initWithImage:neadImage];
[finalyOne addTarget:passthroughFilter1];
[finalyOne processImage];
[finalyOne addTarget:passthroughFilter2];
[finalyOne processImage];
2.通過GPUImageFilterGroup,GPUImageFilterGroup是多個filter集合,terminalFilter是最終合成的濾鏡,在group中添加或者刪除是操作的terminalFilters這個數(shù)組,前邊用的GPUImageBeautifyFilter就是基于此,里邊實現(xiàn)美顏,磨皮等功能.此處粘貼其中部分代碼,詳細可直接下載GPUImageBeautifyFilter類,實現(xiàn)比較簡單.
// First pass: face smoothing filter
_bilateralFilter = [[GPUImageBilateralFilter alloc] init];
_bilateralFilter.distanceNormalizationFactor = 4.0;
[self addFilter:_bilateralFilter];
// Second pass: edge detection
_cannyEdgeFilter = [[GPUImageCannyEdgeDetectionFilter alloc] init];
[self addFilter:_cannyEdgeFilter];
// Third pass: combination bilateral, edge detection and origin
_combinationFilter = [[GPUImageCombinationFilter alloc] init];
[self addFilter:_combinationFilter];
// Adjust HSB
_hsbFilter = [[GPUImageHSBFilter alloc] init];
[_hsbFilter adjustBrightness:1.1];
[_hsbFilter adjustSaturation:1.1];
[_bilateralFilter addTarget:_combinationFilter];
[_cannyEdgeFilter addTarget:_combinationFilter];
[_combinationFilter addTarget:_hsbFilter];
self.initialFilters = [NSArray arrayWithObjects:_bilateralFilter,_cannyEdgeFilter,_combinationFilter,nil];
self.terminalFilter = _hsbFilter;
剛開始接觸GPUImage,功能很強大,希望懂得人指出錯誤,如果給些學(xué)習(xí)資料那是更好的.