美文网首页iOS学习开发
GPUImage图片处理的使用

GPUImage图片处理的使用

作者: _小迷糊_997 | 来源:发表于2018-06-01 22:30 被阅读46次

    关于GPUImage

    这里直接引用官方描述:
    The GPUImage framework is a BSD-licensed iOS library that lets you apply GPU-accelerated filters and other effects to images, live camera video, and movies. In comparison to Core Image (part of iOS 5.0), GPUImage allows you to write your own custom filters, supports deployment to iOS 4.0, and has a simpler interface. However, it currently lacks some of the more advanced features of Core Image, such as facial detection.

    内容大意为:GPUImage是使用GPU处理图像的、他可以对图片、实时画面、视频进行处理。他允许你自定义滤镜、支持iOS4.0。然而,目前缺乏核心形象的一些更高级的功能,比如面部检测。

    GPUImage是一个基于GPU图像和视频处理的开源iOS框架,提供各种各样的图像处理滤镜,并且支持照相机和摄像机的实时滤镜; 基于GPU的图像加速,因此可以加速对实时摄像头视频、电影以及image的滤镜和其它效果处理,并且能够自定义图像滤镜。 GPUImage支持ARC。

    使用GPUImage处理图片比Core Image更简单,只需要将过滤器赋给图片对象即可,不用考虑context或者设备等其他问题。GPUImage提供了除高斯模糊外的其他几种不同效果的模糊,虽然Core Image也提供了几种模糊效果,但目前在iOS上能用的就只有高斯模糊,而GPUImage可用的有FastBlur, GaussianBlur, GaussianSelectiveBlur 和 BoxBlur。GPUImage还支持自定义的过滤器。

    滤镜基本原理

    滤镜处理的原理就是把静态图片或者视频的每一帧进行图形变换再显示出来。它的本质就是像素点的坐标和颜色变化。

    图像处理流程

    数据源需要实现GPUImageOutput接口,而后续各个环节(包括最后处理输出结果)的对象都要实现GPUImageInput接口。每个处理环节都是从上一个环节获取图像数据,进行处理后再将结果传递给下一个。下游的处理对象称为上一步的target。使用addTarget:方法为处理链路添加每个环节的对象。一个常见的链条如下:数据源(例如GPUImageVideoCamera或者GPUImageMovie,或GPUImageStillCamera,或GPUImagePicture
    )->各类filter->GPUImageView如果需要将结果输出到文件,只要把上述流程中最末的GPUImageView改为一个GPUImageMovieWriter即可。

    使用步骤:

    方法一:编译成静态库,然后导入.a静态库和usr文件夹
    方法二:解压文件,在解压好的文件夹中有个bulid.sh文件,打开终端

    cd GPUImage的文件夹位置
    

    然后将bulid.sh文件拖入到终端中,运行

    3.添加

    运行之后,文件夹中会多出一个名为bulid的文件夹,在此文件夹中找到 release-iPhone文件夹。在该文件夹下有两个文件,将这两个文件夹拷贝到所要添加的工程中;

    4.导入所需库
    添加下面这些系统framework:
    CoreMedia
    CoreVideo
    OpenGLES
    AVFoundation
    QuartzCore

    GUPImage里有一张标准图如下


    标准图

    设计师用 Photoshop 调出来的色彩效果输出在了这种「格子图」上,在 App 里通过解析「格子图」得到了色彩的变化规则,然后把这个规则应用在了图片/视频上,这种规则就是一种滤镜的算法。注意,这里只能进行颜色上的调整(曲线,色彩平衡等),其他效果调整也只限于利用图层间混合模式的更改,例如可做暗角、漏光等效果。

    GPUImage中自带三种这样的滤镜GPUImageAmatorkaFilter,这个滤镜就是lookup_amatorka.png 参照基本图在PS上做出来的、GPUImageMissEtikateFilter、GPUImageSoftEleganceFilter,根据这样的方法,把标准图给设计师,设计师添加完产品需要的调色动作,把新图导入程序,调用上面GPUImage中的方法,就得到了想要的滤镜。

    使用过程中遇到的一些问题:

    -[UIView nextAvailableTextureIndex]: unrecognized selector sent to instance 0x16658d00

    在storyboard里面把viewControl的view的类改为GPUImageView!!不然会报错,这也是烦扰了我半天的问题!google到了stackOverFlow才找到的答案。。
    如果还报错,看看target-build setting里面,other linker flags 里面是否添加了 -fobjc-arc -ObjC 这两项

    5.如果程序运行时在[[[GPUImageContextsharedImageProcessingContext] context] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; 出现EXC_BAD_ACCESS。
    需要修改Product->Scheme->Edit Scheme->Options->GPU Frame Capture 选择 Disabled。

    最后

    如果你最近的工作很闲,注意了,这可能是危机的先兆!

    大家如果想看更多干货可以帮忙点个关注跟喜欢,其实作为一个开发者,有一个氛围良好的学习交流圈子很重要,大家可以加入我的一个iOS交流群656315826,大家一起交流成长!

    相关文章

      网友评论

        本文标题:GPUImage图片处理的使用

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