2

Camera所以我用,SurfaceView和设置了这个相机预览SurfaceHolder。我还有一个ImageView我将放置相机图像的修改版本的地方,我希望它能够更新,比如说每秒一次。

当我从“res”加载图像时,所有代码都准备好了并且已经可以工作,但是我很难从相机中读取图像数据。

我已经尝试过以下操作:

  1. 创建一个intentforMediaStore.ACTION_IMAGE_CAPTURE并开始onActivityResult获取一个小缩略图(实际上对我来说已经足够了)(Bitmap)data.getExtras().get("data")

    问题是这会打开相机应用程序,您需要“手动”拍照

  2. 创建Camera.PreviewCallback,获取YuvImage,并使用 将其转换为图像YuvImage.compressToJpeg(...)

    这里的问题是,无论何时何地放置 Camera.setPreviewCallbackWithBuffer(PreviewCallback).

  3. PreviewHolder尝试通过使用锁定到画布lockCanvas()并尝试将其转换为位图来直接获取数据

    显然不起作用。

编辑: 完成这项工作的最佳方法是什么?我的意思是二维码阅读器必须连续读取相机中的图像数据,它们是如何工作的?

4

1 回答 1

5

我选择了 2 号选项并最终使它起作用。

使用了这个回调,忘记了@Override之前的

private Camera.PreviewCallback  previewCallback= new Camera.PreviewCallback()
{   
    @Override
    public void onPreviewFrame(byte[] data,Camera cam)
    {
            Camera.Size previewSize = cam.getParameters().getPreviewSize();
            YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21,previewSize.width,previewSize.height, null);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            yuvImage.compressToJpeg(new Rect(0,0,previewSize.width,previewSize.height),80,baos);
            byte[] jdata = baos.toByteArray();
            Bitmap bitmap = BitmapFactory.decodeByteArray(jdata,0,jdata.length);    
    }
};

并使用setPreviewCallback而不是启动它setPreviewCallbackWithBuffer

SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() 
{   
    public void surfaceCreated(SurfaceHolder holder) {

        camera.setPreviewCallback(previewCallback);
    }
}
于 2013-11-21T00:31:06.597 回答