从Android摄像头中提取RGB值

时间:2016-01-17 23:37:55

标签: android camera stream rgb

我尝试做的是从Android相机预览中拍摄的照片中获取RGB值流。

所以我已经在线查看了有关Stackoverflow和教程的大量问题,而且我已经做到了这一点:

设置以下相机属性:

        Camera.Parameters param = camera.getParameters();

        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int swidth = size.x;
        int sheight = size.y;

        param.setPreviewSize(sheight, swidth);
        camera.setParameters(param);
        param.setPreviewFormat(ImageFormat.NV21);

        camera.setPreviewDisplay(surfaceHolder);
        camera.startPreview();
        camera.setDisplayOrientation(90);

param.setPreviewFormat(ImageFormat.NV21);用于兼容所有设备。

然后我有:

    jpegCallback = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {

                int[] rgbs = new int[swidth*sheight]; //from above code
                decodeYUV(rgbs, data, swidth, sheight);
                for(int i = 0; i<rgbs.length; i++)
                    System.out.println("RGB: " + rgbs[i]);

其中decodeYUV()是给定here on SO的方法。我尝试过使用这两种答案(方法),并得到了类似的结果。这意味着它必须正常工作,我只是做错了。

现在,我假设它采用ARGB格式。

我从上面的代码中得到以下输出流:

RGB: -16757489
RGB: -16059990
RGB: -9157
RGB: -49494
RGB: -2859008
RGB: -7283401
RGB: -4288512
RGB: -3339658
RGB: -6411776
RGB: -13994240
RGB: -16750475
RGB: -16735438
RGB: -14937280
RGB: -3866455
RGB: -16762040
RGB: -16714621
RGB: -11647630
RGB: -37121
...
...

如何以R/G/B = [0..255]

的形式从中提取RGB值

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果格式为ARGB,则:

int argb = rgbs[i];
int a = ( argb >> 24 ) & 255;
int r = ( argb >> 16 ) & 255;
int g = ( argb >> 8 ) & 255;
int b = argb & 255;

>>运算符将int向右移动,&&是一个布尔值,它掩盖了结果的最后八位。