自己今天找了一天的资料,总算把这个问题解决了,在此做个笔记,也希望能给像我一样刚接触GPUImage的新手一点帮助。
其实,用GPUImage给相机简单加滤镜(刚接触的时候不要考虑的太复杂)本来并不难,可网上搜索的好多资料,不是代码给的不全就是掺杂的知识点太多,本来简单的一个东西,自己反而越看越糊涂,最后发现官方给的例子才是最清晰明了的。文章最后我会给出链接* (例子+静态库)*。
先看一下我的总结的吧!想做出一个简单的美颜相机,按照下面的步骤就可以了:
- 实例化一个GPUImageStillCamera对象A(输入源);
- 实例化一个GPUImageFilter对象B(滤镜);
- 实例化一个GPUImageView对象C(输出源)
- A添加B,B添加C;
- 将C添加到控制器的视图上或是key window上,总之就是为了能让你看到相机捕捉到的内容;
- A去调用方法:startCameraCapture开始捕捉景物。
- A去调用方法:capturePhotoAsJPEGProcessedUpToFilter拍照(定格一张图片)。
如果以上步骤你暂时看不懂,那是正常的,你只需要知道有这几个步骤就可以了,然后对照下面的代码找出这几个步骤就可以了,so easy!
#import "ViewController.h"
#import "GPUImage.h"
#import <AssetsLibrary/AssetsLibrary.h>
@interface ViewController ()
@property(strong, nonatomic) GPUImageStillCamera *mCamera;
@property(strong, nonatomic) GPUImageFilter *mFilter;
@property(strong, nonatomic) GPUImageView *mGPUImgView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//步骤--------------1
//第一个参数表示相片的尺寸,第二个参数表示前、后摄像头
_mCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
//竖屏方向
_mCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
//步骤--------------2
//这个滤镜你可以换其它的,官方给出了不少滤镜
_mFilter = [[GPUImageStretchDistortionFilter alloc] init];
//步骤--------------3
_mGPUImgView = [[GPUImageView alloc]initWithFrame:self.view.bounds];
//步骤--------------4
[_mCamera addTarget:_mFilter];
[_mFilter addTarget:_mGPUImgView];
//步骤--------------5
[self.view addSubview:_mGPUImgView];
//步骤--------------6
[_mCamera startCameraCapture];
//添加一个按钮触发拍照
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake((self.view.bounds.size.width-80)*0.5, self.view.bounds.size.height-60, 80, 40)];
btn.backgroundColor = [UIColor redColor];
[btn setTitle:@"拍照" forState:UIControlStateNormal];
[self.view addSubview:btn];
[btn addTarget:self action:@selector(takePhoto) forControlEvents:UIControlEventTouchUpInside];
}
-(void)takePhoto{
//步骤--------------7
[_mCamera capturePhotoAsJPEGProcessedUpToFilter:_mFilter withCompletionHandler:^(NSData *processedJPEG, NSError *error){
//将相片保存到手机相册(iOS8及以上,该方法过期但是可以用,不想用请搜索PhotoKit)
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageDataToSavedPhotosAlbum:processedJPEG metadata:_mCamera.currentCaptureMetadata completionBlock:^(NSURL *assetURL, NSError *error2)
{
if (error2) {
NSLog(@"ERROR: the image failed to be written");
}
else {
NSLog(@"PHOTO SAVED - assetURL: %@", assetURL);
}
}];
}];
}
代码就这么一点,一个简单的滤镜就添加好了。相信应该还是很容易看懂的吧!本人也刚接触GPUImage,如有错误之外望大神指教。
官方链接在此 ,要想将GPUImage导入自己的项目需要编译其中iOS平台下的静态库,如果你不知道或是不想这么做的话,可以私信我(或邮箱479008939@qq.com),我将编译好了的结果给你。