【问题标题】:OnPreviewFrame data image to imageViewOnPreviewFrame 数据图像到 imageView
【发布时间】:2013-11-30 09:37:41
【问题描述】:

我正在尝试从相机的预览中获取字节[],将其转换为位图并使用 imageView.setImageBitmap() 将其显示在图像视图上

我已经设法开始预览并将其显示在 SurfaceView 上,但我不知道如何在 RGB 位图中转换 byte[] 数据(我认为是 Yuv 格式)以将其显示在图像视图。

我正在尝试的代码如下:

camera = camera.open();
parameters = camera.getParameters();
camera.setParameters(parameters);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
camera.setPreviewDisplay(surfaceHolder);
camera.setPreviewCallback(this);
camera.startPreview();

预览回调是这样的

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

    Camera.Parameters parameters = camera.getParameters();
    int width = parameters.getPreviewSize().width;
    int height = parameters.getPreviewSize().height;
    ByteArrayOutputStream outstr = new ByteArrayOutputStream();
    Rect rect = new Rect(0, 0, width, height); 
    YuvImage yuvimage=new YuvImage(data,ImageFormat.NV21,width,height,null);
    yuvimage.compressToJpeg(rect, 100, outstr);
    Bitmap bmp = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());
    imgView1.setImageBitmap(bmp);        
}

预览有效,但 imageView 仍然为空

有什么想法吗?

【问题讨论】:

  • 在哪里设置 imageView.setImageBitmap(bmp); ?
  • 位图后 bmp = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());
  • 确保 outstr.size()!=0!!?
  • 对不起,回答晚了...但是,我应该如何检查?
  • 查看 outstr.length() 或其他函数以检查文档中 ByteArrayOutputStream 类中的大小

标签: android bitmap android-camera yuv


【解决方案1】:

您可能没有在 UI 线程中打开相机。但是,您需要确保在 UI 线程中调用 setImageBitmap:

@Override
public void onPreviewFrame(final byte[] data, Camera camera) {
    Camera.Parameters parameters = camera.getParameters();
    int width = parameters.getPreviewSize().width;
    int height = parameters.getPreviewSize().height;

    YuvImage yuv = new YuvImage(data, parameters.getPreviewFormat(), width, height, null);

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    yuv.compressToJpeg(new Rect(0, 0, width, height), 50, out);

    byte[] bytes = out.toByteArray();
    final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

    MyActivity.this.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            ((ImageView) findViewById(R.id.loopback)).setImageBitmap(bitmap);
        }
    });
}

【讨论】:

  • 嘿@Bla...我正在开发一个 CustomCaemra 应用程序。我有同样的问题。我还希望将多个相机预览到单个活动中[就像在 GridView 中一样]。请帮助我如何实现这一点..我已经提出了问题,但没有人给我答案....这是我的问题链接。 ......stackoverflow.com/questions/41392791/…
  • 我在谷歌上搜索并尝试了更多教程、库[grafica too]。但我没有实现这种类型的预览[多个 Cmaera 预览]。我发现更多问题与我在 Stackoverflow 中的问题相同。但与我的问题相同,没有人给出答案。请参阅此链接我想要这种类型的视图....i.stack.imgur.com/WYHuj.jpg
猜你喜欢
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多