使用iOS原生框架实现实时滤镜效果

实时滤镜即用户在用iOS设备取景的时候可以将选配的滤镜效果叠加到实时变化的图像上,使用户在拍摄时就有了一个相应效果的心里预期,这点上区别与静态滤镜,提升了用户体验。一些知名的图像处理app不少也支持了实时滤镜效果。作为个人开发者如何实现?

使用谷歌搜索关键词:real-time filter 得到关于实时滤镜的比较靠谱的解决办法里,绝大多数都将链接指向了一个第三方实时滤镜框架:GPUImage。

GPUImage如其名字描述,是基于OpenGL ES 2.0的通过GPU硬件加速的开源滤镜框架,相关链接: http://www.sunsetlakesoftware.com/2012/02/12/introducing-gpuimage-framework

从iOS5开始,原先仅支持macOS的图像处理框架:CoreImage就已经提供给了iOS开发者,意味着iOS设备上从此也可以很容易就能处理图片的各种效果,色彩,曝光,饱和度,变形神马的,然而苹果关于这个的官方文档不怎么完善也没有示例代码,所以大家很少用它。    

在Stack overFlow上看到了一个支持率很高的说法:CoreImage无法达到GPUImage所能达到的实时帧率(FPS),图像会非常的卡,相关链接: http://stackoverflow.com/questions/6625888/are-the-core-image-filters-in-ios-5-0-fast-enough-for-realtime-video-processing。对于这个先不予评论。

然而滤镜效果是一个属于门槛比较高的图像处理领域的问题,需要复杂的RGB、HSV、YUV等颜色空间矩阵的各种变换叠加算法来实现。普通开发者不可能自己实现这类滤镜函数,同时开源的资源又不多大家能搜索到的就那么几个,即便GPUImage可以出实时的进行滤镜叠加。

其实并不像个开源社区所描述的只有GPUImage能达到实时滤镜的目的,iOS原生框架就可以!而且非常简单,在2011,2012的WWDC上都有提到过。通过CoreVideo提供实时图像数据,通过CoreImage转化成叠加了滤镜效果的图像,并“有效”的呈现到显示屏上。

关于如何有效呈现,如果是通常的处理办法,应用层会将得到的图片资源推到OpenGL层进行处理,然后再返回给应用层,应用层将图片设置给UI控件后,再推给OpenGL层才最终显示到屏幕上。这中间的image I/O自然会产生一些的资源消耗和时间浪费。对于一般的静态图片展示没问题,但是如果想要实时刷新的FPS达到30左右或以上的(我个人测试来看,达到这个数值标准基本上就是流畅的),对于老设备(iPhone4及以下)来说就不可能,反映出来的就是非常的卡,我想GPUImage也是在这种条件下进行的实验比对吧。

较高效的处理办法就是,由应用层将图片资源传给OpenGL层进行处理完毕后,直接显示到屏幕上。达到这个目的就不能用通常的UIView中的CALayer来加载资源,而是需要EAGLLayer,通过它来图像数据buffer渲染到屏幕上。经测试工具coreanimation显示,iPhone4能将常用滤镜sepia tone跑到31,对于4s来说更不在话下。因此通过GLES层来直接渲染图像非常关键。

CoreImage在iOS5中提供49种滤镜,iOS6是94个,这些滤镜很多又可以任意叠加,理论上可以实现非常多的滤镜效果。而且mac OS上目前支持一百多种滤镜,相信未来会酌情陆续移植到iOS上来。自己写或是使用一些滤镜编辑器,开发者可以方便直观的调配滤镜参数,如果有个美术帮忙,那就更方便了。所以从开发的稳定性,扩展性,易用性,维护性等角度来看,采用原生框架实现实时滤镜的技术优势是不言而喻的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值