类似于美图秀秀android版,怎么实现camera在预览的时候实现实时获取数据,并对图像数据进行渲染,例如变色或者加阴影等?
是利用camera中什么回调函数吗,是onPreviewFrame吗?但是看到好像不太正确,请问有没有相关例子,谢谢!
类似于美图秀秀android版,怎么实现camera在预览的时候实现实时获取数据,并对图像数据进行渲染,例如变色或者加阴影等?
是利用camera中什么回调函数吗,是onPreviewFrame吗?但是看到好像不太正确,请问有没有相关例子,谢谢!
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
2 回答1.3k 阅读✓ 已解决
2 回答2.6k 阅读
2 回答1.7k 阅读
1 回答2.1k 阅读
1 回答1.1k 阅读
1 回答1.3k 阅读
1.3k 阅读
你可以去下载OpenCV或者FastCV的安卓版例子去看看实时滤镜的实现方法,camera帧数据的输出接口是onPreviewFrame没错,但好像得到的原始是YUV格式的,需要空间转换到RGB,那两个库都有相关性能优化。
实时滤镜的实现方法有两种:
1.CPU算法,较慢
2.GPU Shader算法,常用方法,性能好
具体算法请自行查找研究。