android摄像头开发,将Camera.onPreviewFrame里面的data转换成bitmap

本文介绍了如何在Android中使用Camera.PreviewCallback监听摄像头预览帧,并将接收到的byte[]数据转换为Bitmap进行图像处理。通过设置oneShotPreviewCallback避免频繁回调,解决SkImageDecoder::Factory returned null的问题,实现流畅的图像识别功能。
摘要由CSDN通过智能技术生成

最近在做的几个项目都和摄像头有关,其中不乏图像识别的,但是拍照识别有时候感觉还是有些low,直接把画面一对准自己就识别了多好,就像zxing扫描二维码一样,于是上网查了很多资料,找到了

需要给camera对象设置一个 Camera.PreviewCallback,在这个回调中实现一个方法onPreviewFrame(byte[] data, Camera camera)

当然如果我们设置camera.setPreviewCallback(callback);在设置后onPreviewFrame这个方法会被一直调用,我们可以在摄像头对焦成功够设置

camera.setOneShotPreviewCallback(previewCallback);如果这样设置onPreviewFrame这个方法就会被调用一次,我们只要将其中的data取回做成bitmap来做相应的处理就行了

那么有人问了,为什么不在对焦成功后拍照呢,因为拍照后画面会顿一下,无论你再怎么设置那几个参数时间(具体名字忘了),也会有相当短暂的停顿,所以要借助onPreviewFrame这个方法来获取图像,那么直接上onPreviewFrame这个方法的代码吧

Bitmap bitmap;
    public void runInPreviewFrame(byte[] data, Camera cam
非常抱歉,我之前的回答有误,Android Camera.Parameters确实没有提供setPreviewFlipped()方法来设置预览镜像。如果您需要设置预览镜像效果,可以使用以下两种方法: 1. 使用Matrix类来翻转预览视图 您可以使用Matrix类来翻转预览视图。在setPreviewCallback()方法中,获取相机预览数据的byte[]数组,将其转换为Bitmap对象,使用Matrix类将Bitmap对象水平或垂直翻转,然后将其显示在SurfaceView上。 以下是一个示例代码片段,演示如何使用Matrix类来翻转预览视图: ```java Camera camera = Camera.open(); Camera.Parameters parameters = camera.getParameters(); // 设置预览大小 parameters.setPreviewSize(640, 480); camera.setParameters(parameters); // 绑定SurfaceView并开始预览 SurfaceView surfaceView = findViewById(R.id.surface_view); SurfaceHolder surfaceHolder = surfaceView.getHolder(); camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); // 设置预览回调 camera.setPreviewCallback(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { // 将预览数据转换为Bitmap对象 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); // 创建Matrix对象并翻转Bitmap Matrix matrix = new Matrix(); matrix.preScale(-1, 1); Bitmap flippedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); // 显示翻转后的Bitmap surfaceView.draw(new BitmapDrawable(getResources(), flippedBitmap)); } }); ``` 在上面的代码中,我们使用Matrix类的preScale()方法将Bitmap对象水平翻转,然后使用Bitmap.createBitmap()方法创建翻转后的Bitmap对象,并将其显示在SurfaceView上。 2. 使用Camera.CameraInfo类来翻转预览视图 您也可以使用Camera.CameraInfo类的facing属性来翻转预览视图。在Camera.open()之后,您可以调用Camera.CameraInfo类的静态方法getCameraInfo()来获取相机信息,然后使用Camera.Parameters类的setPreviewSize()方法设置预览大小,并根据Camera.CameraInfo类的facing属性设置预览镜像。 以下是一个示例代码片段,演示如何使用Camera.CameraInfo类来翻转预览视图: ```java Camera camera = Camera.open(); Camera.Parameters parameters = camera.getParameters(); // 设置预览大小 parameters.setPreviewSize(640, 480); // 获取相机信息 Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); Camera.getCameraInfo(0, cameraInfo); // 根据相机信息设置预览镜像 if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { parameters.setPreviewSize(640, 480); camera.setDisplayOrientation(180); } camera.setParameters(parameters); // 绑定SurfaceView并开始预览 SurfaceView surfaceView = findViewById(R.id.surface_view); SurfaceHolder surfaceHolder = surfaceView.getHolder(); camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); ``` 在上面的代码中,我们使用Camera.CameraInfo类的getCameraInfo()方法获取相机信息,然后根据相机信息的facing属性设置预览镜像。如果相机是前置摄像头,我们将预览大小设置为640x480,并使用Camera.setDisplayOrientation()方法将预览旋转180度,实现水平翻转的效果。如果相机是后置摄像头,我们不进行任何操作,保持预览不变。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值