Android onPreviewFrame处理原始数据

时间:2016-06-02 06:59:30

标签: android performance android-studio bitmap yuv

我正在使用Android Studio,我正在创建一个启动相机预览的应用,并处理onPreviewFrame(byte[] data, Camera camera) android.hardware.Camera回调方法中返回的图像。返回的数据采用NV21格式( Camera类的默认值)。在这种方法中,我收到一个raw图像,我需要将其转换为RGB图像才能处理它,因为我的应用程序需要处理图像中的颜色。我使用以下方法将byte[]数组转换为位图,然后适当地使用位图。

        private Bitmap getBitmap(byte[] data, Camera camera) {

            // Convert to JPG
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            previewSize = camera.getParameters().getPreviewSize();

            yuvimage = new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null);
            yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 80, baos);
            jdata = baos.toByteArray();

            Bitmap bitmap = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);

            // rotate image
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mtx, true);

            return bitmap;
        }

这种方法效果很好,我得到了理想的结果。但由于我的预览大小设置为运行应用程序的设备所支持的最大值(目前在我的手机1920x1088上),因此此方法耗时太长,因此我每秒只能处理1到2张图像。如果我删除转换方法,我可以看到onPreviewFrame方法每秒被调用10到12次,这意味着我每秒可以收到那么多,但由于转换,我只能处理1或2。

我是否可以使用更快的方式从传递的RGB数组中接收byte[]矩阵?

1 个答案:

答案 0 :(得分:0)

实际上在我的情况下,删除位图的旋转就足够了,因为解码位图需要250-350ms并且旋转位图需要~500ms。所以我删除了旋转并改变了扫描的方向。 Fortunetly这根本不难。如果我有一个函数检查给定像素的颜色,它看起来像这样:

boolean foo(int X, int Y) {
    // statements
    // ...
}

现在看起来像这样:

boolean foo(int X, int Y) {
    int oldX = X;
    int oldY = Y;

    Y = bitmap.getHeight() - oldX;
    X = oldY;

    // statements
    // ...
}

希望这会有所帮助。 :)