首页 > 安卓怎么实现改变camera实时预览时的图像

安卓怎么实现改变camera实时预览时的图像

类似于美图秀秀android版,怎么实现camera在预览的时候实现实时获取数据,并对图像数据进行渲染,例如变色或者加阴影等?
是利用camera中什么回调函数吗,是onPreviewFrame吗?但是看到好像不太正确,请问有没有相关例子,谢谢!


你可以去下载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

【热门文章】
【热门文章】