开发者

How Can i read the preview frames from the actual opensource android Camera

How can i read the preview frames from the actual camera sour开发者_C百科ce code? I am trying to modify the actual source code of camera application in android for reading the preview frames. Can anyone help me with this.


You shouldn't have to change the actual source code for reading frames. Implementing the Camera.PreviewCallback interface should suffice. It returns raw data from the camera.


Before messing with the source of the camera app try the example here: CameraPreview Then implement the Camera.PreviewCallback. The captured frame comes in YUV420SP so you have to convert it to rgb in order to convert it into a colored bitmap and show it on screen. Like this :

        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {

        int imageWidth = camera.getParameters().getPreviewSize().width  ;
        int imageHeight =camera.getParameters().getPreviewSize().height ;
        int RGBData[] = new int[imageWidth* imageHeight]; 
        byte[] mYUVData = new byte[data.length];    
        System.arraycopy(data, 0, mYUVData, 0, data.length);
        decodeYUV420SP(RGBData, mYUVData, imageWidth, imageHeight);

        Bitmap bitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(RGBData, 0, imageWidth, 0, 0, imageWidth, imageHeight);
    }

    static public void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {
            final int frameSize = width * height;

            for (int j = 0, yp = 0; j < height; j++) {
            int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
            for (int i = 0; i < width; i++, yp++) {
                int y = (0xff & ((int) yuv420sp[yp])) - 16;
                if (y < 0) y = 0;
                if ((i & 1) == 0) {
                    v = (0xff & yuv420sp[uvp++]) - 128;
                    u = (0xff & yuv420sp[uvp++]) - 128;
                }

                int y1192 = 1192 * y;
                int r = (y1192 + 1634 * v);
                int g = (y1192 - 833 * v - 400 * u);
                int b = (y1192 + 2066 * u);

                if (r < 0) r = 0; else if (r > 262143) r = 262143;
                if (g < 0) g = 0; else if (g > 262143) g = 262143;
                if (b < 0) b = 0; else if (b > 262143) b = 262143;

                rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
            }
        }
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜