iOS开发之GPUImage(一)—初探(给相机加滤镜)

作者: 绿豆粥与茶叶蛋 | 来源:发表于2017-03-24 15:57 被阅读2425次

    前言

    本文为作者iOS开发之GPUImage系列的第一篇,由于作者项目中即将涉及到直播加滤镜,美颜等功能,所以拿来github上很火的一个滤镜框架GPUImage学习一下。本篇文章介绍的Demo使用cocopods引入了GPUImage框架,你也可以手动拖入,同时引入了简友琨君自定义的美颜滤镜。作为学习的开始,本片只涉及到为摄像头加单滤镜,由浅入深,循序渐进。

    正文

    本文主要介绍,如何为相机加滤镜,以及加滤镜后获取图片储存在自己的相册中。Demo的效果图如下:

    图1-1 边缘检测滤镜与哈哈镜滤镜.png

    简单的总结相机加滤镜分为以下几个步骤:

    • 初始化相机;
    • 初始化滤镜(GPUImage提供了120多种滤镜的效果,可以自己替换);
    • 初始化GPUImageView;
    • 将初始化过的相机加到目标滤镜上;
    • 将滤镜加在目标GPUImage上;
    • GPUImage加在控制器视图上;
    • 相机开始捕捉画面;
    • 将相机捕捉的画面存在手机的相册中;

    注:现在iOS访问用户的相机和相册都要事先在info.plist文件中提前布置请求权限。是否允许访问相册:Privacy - Photo Library Usage Description;是否允许访问相机:Privacy - Camera Usage Description。

    废话少说,以哈哈镜滤镜为例,直接上代码:

    步骤一:初始化相机,第一个参数表示相册的尺寸,第二个参数表示前后摄像头

    self.myCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionFront];
    //竖屏方向
    self.myCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
    

    步骤二:初始化哈哈镜滤镜

    GPUImageStretchDistortionFilter *stretchDistortionFilter = [[GPUImageStretchDistortionFilter alloc] init];
    

    步骤三:初始化GPUImageView

    self.myGPUImageView = [[GPUImageView alloc] initWithFrame:CGRectMake(0, 0, ScreenW, ScreenH)];
    

    步骤四:将初始化过的相机加到目标滤镜上

    [self.myCamera addTarget:stretchDistortionFilter];
    

    步骤五:将滤镜加在目标GPUImage上

    [stretchDistortionFilter addTarget:self.myGPUImageView];
    

    步骤六:GPUImage加在控制器视图上

    [self.view addSubview:self.myGPUImageView];
    

    步骤七:相机开始捕捉画面

    [self.myCamera startCameraCapture];
    

    步骤八:将相机捕捉的画面存在手机的相册中

    //定格一张图片 保存到相册
    [self.myCamera capturePhotoAsPNGProcessedUpToFilter:self.myFilter withCompletionHandler:^(NSData *processedPNG, NSError *error) {
            
        //拿到相册,需要引入Photo Kit
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            //写入图片到相册
            PHAssetChangeRequest *req = [PHAssetChangeRequest creationRequestForAssetFromImage:[UIImage imageWithData:processedPNG]];
        } completionHandler:^(BOOL success, NSError * _Nullable error) { 
            NSLog(@"success = %d, error = %@", success, error);
        }];   
    }];
    

    源码已上传至fenglinyunshi-git,欢迎下载,并提出宝贵意见。

    结语

    本片Demo只涉及到为摄像头加单滤镜的情况,下一篇将会介绍混合滤镜的做法,Demo总共用到了八种不同的滤镜,以及对各个滤镜属性值做了相应的设定。有兴趣的朋友可以在上面的git链接中下载Demo查看。
    未完待续...

    读书不觉已春深,一寸光阴一寸金。

    相关文章

      网友评论

      • 不辣先生:GPUImageBeautifyFilter 继承于GPUImageFilterGroup的意义是什么啊?不可以直接用Group吗
      • 海鲜味龙潭方便面:代码写的贼清楚666
      • 9fcd33829c9b:请问 我自拍的时候 为什么和正常相机是相反方向的怎么办 大神
        chjsun:还没开始看这个demo。但是我在自定义相机的时候也碰到这个问题,解决方法是在判断前置摄像头后将拍的图反转。
        UIImage *image = [UIImage imageWithData:imageData];

        AVCaptureDevicePosition position = [[_input device] position];
        if (position == AVCaptureDevicePositionFront){
        // 反转。重新生成新的UIimage
        UIImageOrientation imageOrientation = UIImageOrientationLeftMirrored;
        image = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:imageOrientation];
        }
        火三君:我的也是,请问你有解决 么?
      • 刺客小生110:[self.myCamera capturePhotoAsPNGProcessedUpToFilter:self.myFilter withCompletionHandler:^(NSData *processedPNG, NSError *error) {

        //拿到相册,需要引入Photo Kit
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        //写入图片到相册
        PHAssetChangeRequest *req = [PHAssetChangeRequest creationRequestForAssetFromImage:[UIImage imageWithData:processedPNG]];
        } completionHandler:^(BOOL success, NSError * _Nullable error) {
        NSLog(@"success = %d, error = %@", success, error);
        }];
        }];
        这个方法我的偶尔会报错,就很尴尬,你的有出现过么
      • 非洲胚胎:完美
        绿豆粥与茶叶蛋:@非洲胚胎 :yum:

      本文标题:iOS开发之GPUImage(一)—初探(给相机加滤镜)

      本文链接:https://www.haomeiwen.com/subject/wwrfottx.html