Android 您的NV21到RGB不工作?

Android 您的NV21到RGB不工作?,android,camera,Android,Camera,我正着手开发一个应用程序,它可以监控相机预览,并对其进行一些图像处理,在画布上显示int。作为诊断,我有以下代码: camera = Camera.open(); ImageFormat imf = new ImageFormat(); Camera.Parameters param = camera.getParameters(); param.setPreviewSize(128, 128); preview_format = param.getPreviewFormat(); Camer

我正着手开发一个应用程序,它可以监控相机预览,并对其进行一些图像处理,在画布上显示int。作为诊断,我有以下代码:

camera = Camera.open();

ImageFormat imf = new ImageFormat();
Camera.Parameters param = camera.getParameters();
param.setPreviewSize(128, 128);
preview_format = param.getPreviewFormat();
Camera.Size sz = param.getPreviewSize();

myimage = new int[sz.width*sz.height];
在运行时,它报告preview_格式为17,我理解为“NV21”

后来我有:

    camera.setPreviewCallback(new PreviewCallback()
    {    
          public void onPreviewFrame(byte[] _data, Camera _camera)
          {
              YUV_NV21_TO_RGB(myimage , _data, 128, 128) ;
          }
    });
函数YUV_NV21_TO_RGB取自

同时,在另一个线程中,我有:

    canvas.drawBitmap(
            myimage,        // the int array
            0,              // where to start in the array
            128,            // the stride ???
            200,            // x coord of where to display
            200,            // y coord of where to display
            128,            // wid
            128,            // ht
            false,          // alpha used?
            null);          // the paint used
在下面的方框中可以看到结果图像和其他诊断。当我移动手机时,条纹会发生变化,在某种程度上似乎与相机所指向的东西相对应,但很明显它已经被弄坏了。我尝试使用另一个找到的函数和另一个来自维基百科的函数,但结果似乎相同。有什么想法吗

编辑:我的一个想法是,可能NV21没有完全指定格式-可能是一类格式,您需要继续指定每像素位或类似的位

编辑:额外提示-如果我完全覆盖相机,正方形将完全变成纯绿色


您的预览大小不是128乘128,因为您没有设置它。您可以在
摄影机.Parameters
实例上设置它,但不将其应用于摄影机

您需要添加以下行:

camera.setParameters(param);
直接从
摄像机
实例获取参数可能是安全的:

preview_format = camera.getPreviewFormat();
Camera.Size sz = camera.getPreviewSize();

您确定接收的数据是针对128像素宽的NV21编码图像的吗?这两个参数(宽度、格式)中的任何一个都不正确。onPreviewFrame()是否使用24576字节的字节数组调用?\根据eclipse调试器,数据的长度似乎为460800字节。是的,确实如此。你的预览大小是640x480像素。答对了!我很尴尬:-)