随着手机性能的提高,多媒体的应用越来越普遍,其中拍照,录像,美颜等都需要调用手机相机的功能。
相机采集和显示的经典例子是下面谷歌的开源实现,是比较好的入门学习资料:
https://github.com/google/grafika
网上有很多开源的安卓相机的实现,比如下面的实现,只是时间比较久了:
https://github.com/wuhaoyu1990/MagicCamera
比较新的是下面的实现,它封装了GPUImage来进行滤镜和美颜的处理;
https://github.com/cats-oss/android-gpuimage
还有下面的实现,而且有网站说明http://blog.wysaid.org/
https://github.com/wysaid/android-gpuimage-plus
上面的基本都是在Java层做的的滤镜美颜处理,下面的是在C层做的滤镜美颜处理,效率比较高,而且也比较新,有很好的参考学习价值,还有简书的说明;
https://github.com/cangwang/MagicCamera3
基本的思路都是一样,一般首先都是采集数据,数据可以是相机采集的数据,或者是选择的图片;
采集了数据之后,一般通过帧缓冲(FBO)获取到帧数据图,然后再做滤镜处理,为何要这样做呢?
是因为如果你使用摄像头采集帧图是yuv数据,Android中shader(glsl)需要使用GL_OES的扩展库来对数据做特殊处理;如果你想将图片和摄像头采集的数据做同一种转换,那就需要两个不同的文件,意思就是你需要维护两份shader的代码,这是一件很蛋痛的事。那要怎么做才能效率高呢,最好的方式是先用GL_OES采集数据,然后通过帧缓冲来缓冲转变为RGBA数据,这样再做滤镜操作,这样滤镜的shader就只需要一份就了事了。
最后就是添加滤镜的效果,显示到屏幕上,也可以保存到文件中。
感谢上面所有的作者,仅作为学习参考。