加入收藏 | 设为首页 | 会员中心 | 我要投稿 财气旺网 - 财气网 (https://www.caiqiwang.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Android Camera实现图像复制

发布时间:2022-11-16 18:06:07 所属栏目:PHP教程 来源:未知
导读: 做VR产品的时候,有个产品的目标是做一个左右眼的摄像头,实现两个摄像头采集数据,左右分屏的显示在手机屏幕上,当时调研发现,手机因为只有一颗ISP所有一般情况下只能打开一个摄像头,所

做VR产品的时候,有个产品的目标是做一个左右眼的摄像头,实现两个摄像头采集数据,左右分屏的显示在手机屏幕上,当时调研发现,手机因为只有一颗ISP所有一般情况下只能打开一个摄像头,所以当时考虑可以使用手机的摄像头外接一个USB camera。由于当时时间比较紧,所以调研过程中只做了屏幕的分屏显示,而没有做摄像头的输入方式。

当时采用的方法是修改图形显卡(framebuffer)的参数,使得图像在输出的时候能够左右分屏,但是不同的平台下也会出现有的能work有的不work的情况。

所以到现在也没有很好的解决方案。

最近在学习camera相关知识的时候假想了一种使用场景,使用单个摄像头完成摄像头图像的复制,做一个类似左右眼的效果。

设定的方法是在布局文件中设定一个surfaceView和一个ImageView:

记得之前描述过,我们可以通过onPreviewFrame回调函数拿到data数据。既然如此,我们便可以把这部分数据复制到一份显示在屏幕上,实现左右分屏。

要注意的是,此处返回的数组图像格式为NV21(YUV420SP),并不支持直接BitmapFactory.decodeByteArray()方法,需要进行格式转换。参考网上的博客

//将rawImage转换成bitmap

BitmapFactory.Options options = new BitmapFactory.Options();

options.inPreferredConfig = Bitmap.Config.RGB_565;

bitmap = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length, options);

最终调用icon.setImageBitmap(bitmap); 将图像显示出来。

但是正如原作者所说,显示的延时现象很明显。

可以参考网上的多线程的优化方式PHP图像处理,性能优化典范之多线程篇 我们可以使用HandlerThread的方式来进行实现, //创建一个HandlerThread并启动 mHandlerThread=new HandlerThread(“my_handlerthread”); mHandlerThread.start(); 创建handler来启动我们定义的任务 subHandler=new Handler(mHandlerThread.getLooper()); subHandler.post(newMyTask()); 在MyTask中实现具体功能: classMyTaskimplementsRunnable{ @SuppressLint(“NewApi”)@Override public void run(){ doChange(surfaceView.getHolder()); } }

(编辑:财气旺网 - 财气网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!