扫码关注官方订阅号
类似于美图秀秀android版,怎么实现camera在预览的时候实现实时获取数据,并对图像数据进行渲染,例如变色或者加阴影等? 是利用camera中什么回调函数吗,是onPreviewFrame吗?但是看到好像不太正确,请问有没有相关例子,谢谢!
认证高级PHP讲师
你可以去下载OpenCV或者FastCV的安卓版例子去看看实时滤镜的实现方法,camera帧数据的输出接口是onPreviewFrame没错,但好像得到的原始是YUV格式的,需要空间转换到RGB,那两个库都有相关性能优化。 实时滤镜的实现方法有两种: 1.CPU算法,较慢 2.GPU Shader算法,常用方法,性能好 具体算法请自行查找研究。
https://github.com/CyberAgent/android-gpuimage 希望有帮助
public void onPreviewFrame(byte[] data, Camera camera)
就是这个回调. 这个byte[] data就是图像帧数据了...注意这个数据是YUV420格式的...
首先转成RGB格式
public static int[] YV12ToRGB(byte[] src, int width, int height){ int numOfPixel = width * height; int positionOfV = numOfPixel; int positionOfU = numOfPixel/4 + numOfPixel; int[] rgb = new int[numOfPixel*3]; for(int i=0; i<height; i++){ int startY = i*width; int step = (i/2)*(width/2); int startV = positionOfV + step; int startU = positionOfU + step; for(int j = 0; j < width; j++){ int Y = startY + j; int V = startV + j/2; int U = startU + j/2; int index = Y*3; //rgb[index+R] = (int)((src[Y]&0xff) + 1.4075 * ((src[V]&0xff)-128)); //rgb[index+G] = (int)((src[Y]&0xff) - 0.3455 * ((src[U]&0xff)-128) - 0.7169*((src[V]&0xff)-128)); //rgb[index+B] = (int)((src[Y]&0xff) + 1.779 * ((src[U]&0xff)-128)); RGB tmp = yuvTorgb(src[Y], src[U], src[V]); rgb[index+R] = tmp.r; rgb[index+G] = tmp.g; rgb[index+B] = tmp.b; } } return rgb; }
第二步 渲染/加过滤器/加Shader.....
图像处理我就用过jhlabs.....很古老的java库....图像处理部分是直接针对RGB数组的..所以可以很方便的移植到Android上
http://www.jhlabs.com/ip/filters/index.html
全靠CPU运算...效率一般... 不过你需求的变色/加阴影复杂度不高 应该还能接受
你想要效率高可能还要用 RenderScript... 或者OPENGL
比如 https://github.com/CyberAgent/android-gpuimage 这个项目里图形处理部分全部走的 GLES20
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
你可以去下载OpenCV或者FastCV的安卓版例子去看看实时滤镜的实现方法,camera帧数据的输出接口是onPreviewFrame没错,但好像得到的原始是YUV格式的,需要空间转换到RGB,那两个库都有相关性能优化。
实时滤镜的实现方法有两种:
1.CPU算法,较慢
2.GPU Shader算法,常用方法,性能好
具体算法请自行查找研究。
https://github.com/CyberAgent/android-gpuimage
希望有帮助
就是这个回调.
这个byte[] data就是图像帧数据了...注意这个数据是YUV420格式的...
首先转成RGB格式
第二步 渲染/加过滤器/加Shader.....
图像处理我就用过jhlabs.....很古老的java库....图像处理部分是直接针对RGB数组的..所以可以很方便的移植到Android上
http://www.jhlabs.com/ip/filters/index.html
全靠CPU运算...效率一般... 不过你需求的变色/加阴影复杂度不高 应该还能接受
你想要效率高可能还要用 RenderScript...
或者OPENGL
比如 https://github.com/CyberAgent/android-gpuimage
这个项目里图形处理部分全部走的 GLES20