2022-07-21 Android 相机预览数据转Bitmap优化
背景
在Android开发中我们有时候会需要拿到相机预览数据转成bitmap自己做处理。
常用方式
在Android API中提供了 一套转换方式:
private Bitmap convertBitmap(byte[] data) {try {Camera.Size size = mCameraParameters.getPreviewSize();YuvImage img = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);ByteArrayOutputStream baos = new ByteArrayOutputStream(data.length);img.compressToJpeg(new Rect(0, 0, size.width, size.height), 100, baos);byte[] bytes = baos.toByteArray();Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);baos.close();return bitmap ;} catch (IOException e) {e.printStackTrace();}return null;
}//logcat
2022-07-21 11:07:36.389 18675-18675/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:199
2022-07-21 11:07:36.813 18675-18675/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:228
2022-07-21 11:07:37.181 18675-18675/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:199
2022-07-21 11:07:37.552 18675-18675/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:199
2022-07-21 11:07:37.951 18675-18675/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:207
2022-07-21 11:07:38.352 18675-18675/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:201
2022-07-21 11:07:38.750 18675-18675/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:207
2022-07-21 11:07:39.174 18675-18675/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:232
2022-07-21 11:07:39.542 18675-18675/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:199
2022-07-21 11:07:39.907 18675-18675/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:200
2022-07-21 11:07:40.277 18675-18675/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:200
2022-07-21 11:07:40.675 18675-18675/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:201
通过日志看到这种方式转换耗时约200ms
优化方案1
在上述转换过程中img.compressToJpeg()函数中第2个参数表示转换图像的质量,参数范围在0-100,100表示最高质量,我们可以把质量降低一些,这里改成80:
private Bitmap convertBitmap2(byte[] data) {try {Camera.Size size = mCameraParameters.getPreviewSize();YuvImage img = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);ByteArrayOutputStream baos = new ByteArrayOutputStream(data.length);img.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, baos);byte[] bytes = baos.toByteArray();Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);baos.close();return bitmap ;} catch (IOException e) {e.printStackTrace();}return null;
}//logcat
2022-07-21 11:12:33.946 19171-19171/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:112
2022-07-21 11:12:34.074 19171-19171/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:111
2022-07-21 11:12:34.378 19171-19171/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:113
2022-07-21 11:12:34.505 19171-19171/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:111
2022-07-21 11:12:34.815 19171-19171/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:118
2022-07-21 11:12:34.942 19171-19171/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:114
2022-07-21 11:12:35.248 19171-19171/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:117
2022-07-21 11:12:35.544 19171-19171/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:118
2022-07-21 11:12:35.675 19171-19171/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:115
2022-07-21 11:12:35.981 19171-19171/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:116
2022-07-21 11:12:36.280 19171-19171/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:117
通过日志看到耗时约110ms,优化空间还是很大的,但是牺牲了图像的质量,不过通过在设备中的观察,降低到80的质量与100质量的图像看起来差别不大,因此也还可以用。
下面继续将质量降低到40
private Bitmap convertBitmap2(byte[] data) {try {Camera.Size size = mCameraParameters.getPreviewSize();YuvImage img = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);ByteArrayOutputStream baos = new ByteArrayOutputStream(data.length);img.compressToJpeg(new Rect(0, 0, size.width, size.height), 40, baos);byte[] bytes = baos.toByteArray();Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);baos.close();return bitmap ;} catch (IOException e) {e.printStackTrace();}return null;
}//logcat
2022-07-21 11:15:48.097 19529-19529/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:104
2022-07-21 11:15:48.226 19529-19529/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:104
2022-07-21 11:15:48.530 19529-19529/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:107
2022-07-21 11:15:48.656 19529-19529/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:103
2022-07-21 11:15:48.927 19529-19529/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:104
2022-07-21 11:15:49.059 19529-19529/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:103
2022-07-21 11:15:49.364 19529-19529/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:108
2022-07-21 11:15:49.488 19529-19529/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:104
2022-07-21 11:15:49.757 19529-19529/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:105
2022-07-21 11:15:49.888 19529-19529/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:104
2022-07-21 11:15:50.191 19529-19529/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:104
查看日志看到质量40时耗时约100,这个优化空间是很小的,并且图像的质量已经很差了,因此不推荐。
优化方案2
使用Android的RenderScript来转换
private Bitmap convertBitmap4RenderScript(byte[] data) {Camera.Size size = mCameraParameters.getPreviewSize();if (yuvType == null) {yuvType = new Type.Builder(rs, Element.U8(rs)).setX(data.length);in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);}if (rgbaType == null) {rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(size.width).setY(size.height);out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);}in.copyFrom(data);yuvToRgbIntrinsic.setInput(in);yuvToRgbIntrinsic.forEach(out);Bitmap bitmap = Bitmap.createBitmap(size.width, size.height, Bitmap.Config.ARGB_8888);out.copyTo(bitmap);return bitmap;
}//logcat
2022-07-21 11:21:01.082 19879-19879/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:25
2022-07-21 11:21:01.147 19879-19879/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:24
2022-07-21 11:21:01.215 19879-19879/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:25
2022-07-21 11:21:01.280 19879-19879/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:23
2022-07-21 11:21:01.348 19879-19879/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:25
2022-07-21 11:21:01.414 19879-19879/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:24
2022-07-21 11:21:01.480 19879-19879/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:23
2022-07-21 11:21:01.548 19879-19879/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:25
2022-07-21 11:21:01.610 19879-19879/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:22
2022-07-21 11:21:01.680 19879-19879/org.venus.ar.ocr I/System.out: 相机数据转换bitmap时间:23
通过日志可以看出使用RenderScript的内联函数转换bitmap耗时约25ms,相较于使用BitmapFactory.decodeByteArray()函数转换耗时少了很多。
其中使用到RenderScript相关变量的定义和初始化:
//相机预览数据byte[]转bitmap耗时优化方案对象
private RenderScript rs;
private ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic;
private Type.Builder yuvType;
private Type.Builder rgbaType;
private Allocation in;
private Allocation out;private void initRender() {rs = RenderScript.create(this);yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs));
}
在使用yuvToRgbIntrinsic对象之前执行initRender()函数初始化即可,一般放在onCreate()函数中。
http://www.taodudu.cc/news/show-5336501.html
相关文章:
- android 拍照固定区域,android相机区域拍照,快速集成
- Keil里找不到芯片的flash编程算法怎么办?
- Flash编程入门笔记
- 【STM32】STM32内部flash编程和擦除
- stm32的flash编程
- c语言中读取flash值的作用,flash读写程序
- 基于STM32F407 HAL库的Flash编程操作
- STM32F系列单片机内部FLASH编程
- 用Arduino做SPI FLASH的编程器
- STM32---FLASH编程
- Nor Flash 编程
- FLASH模拟EEPROM编程
- Flash编程
- STM32L0芯片FLASH编程示例及提醒
- FLASH编程过程
- 你想要的C/C++游戏源码素材都在这里!
- 简洁的安卓软件app下载页源码
- 二次元页游《幻想物语》全套源码+资源+工具(可转H5手游)
- 页游一键端_火影世界
- 页游服务器系统,页游服务器端
- 众多网页游戏源码素材一键即可获取
- 各版本Office办公软件下载
- 医学信息工程考公务员可以报计算机类的吗,医学类专业考公务员,只能报三不限?这是不是有点浪费啊...
- 趣图 | 要不回家考个公务员吧
- 2007年安徽省公务员录用考试
- 福建C语言省考成绩什么出,福建省公务员考试成绩何时出来
- 【系统自动化开发】Python实现广东省公务员报名系统网站自动登录
- 计算机类公务员2019,2019甘肃公务员考试职位表解读:超三成不限专业
- 公务员计算机基础知识考试,公务员考试计算机基础知识[1]
- 天津公务员 计算机水平,天津公务员考试报考这6类职位,上岸几率更大!
2022-07-21 Android 相机预览数据转Bitmap优化相关推荐
- android相机拍摄格式NV21,如何通过libyuv将NV21格式的android相机预览数据转换为i420?...
public void onPreviewFrame(byte[] data, Camera camera) 我想libyuv到data转换为I420格式.看来NV21ToI420或ConvertTo ...
- android 预览和拍照成像方向不一致,Android相机预览方向深入探究
原标题:Android相机预览方向深入探究 今日快讯 9月7日,北京市交通委召集各区管理部门和15家共享自行车企业负责人,听取共享自行车投放和管理的意见建议,研究决定并下发通知,暂停在本市新增投放共享 ...
- Android相机预览方向
以前对Camera了解的不是太深入,最近有需求把人脸识别 集成到项目,必然会与Camera打交道,遇到一些坑,与大家分享一下. 一.预览方向 Camera.CameraInfo info = ne ...
- Android相机预览设置适配及显示方式
Android相机的部分工作原理. 预览流程 相机预览是Android Camera最常用的功能之一,它是很多功能重要的输入,例如扫码.AR等. 一般而言,相机预览的整体流程,可以通过下图表示: 其中 ...
- Android相机预览页面被压缩和拉伸问题
最近公司要求在原有的项目中添加一个扫码登录的功能,在调试好相机之后,发现相机返回到Surfaceview页面上的预览图片,与我们现实中物品的比例并不相同,在一块正方形的Surfaceview中,预览界 ...
- Android 相机方向传感,Nexus 5x反向横向传感器修复在Android相机预览...
我是Android开发中的新手,所以如果我的问题很简单,我会提前道歉.在我的应用程序的一部分,我需要我的后置摄像头的实时预览,所以我创建了一个自定义类,扩展SurfaceView并实现SurfaceH ...
- Android 相机预览 横屏竖屏 -- 显示
相机在设备上处于固定位置,无论设备是否 是手机.平板电脑或计算机.当设备方向更改时, 相机方向更改.常见的布局显示比率是 4:3. 对于前置摄像头,图像缓冲区逆时针旋转(从 传感器的自然方向) 对于后 ...
- Android相机预览,指定区域显示预览框,在区域内出现人脸进行人脸识别,并抓拍人脸照片存在本地,CameraX,虹软人脸识别
效果图: 第一种是使用camerax进行预览,android camerax预览官方文档,主要通过imageAnalysis,抓帧进行图片处理,然后通过android自带的图片人脸识别FaceDete ...
- android相机预览拍照功能实现
代码目录结构 LAUNCHER activity:CameraActivity : onCreate()方法中创建Camera工具类CameraHelper的实例并初始化: mCameraHelper ...
最新文章
- 复用io selectors模块
- 社区运营破冰也有三大原则八项注意“了,你造吗?
- sharepoint 弹出框
- 旅游服务商Bikego完成A轮融资,共建创投、马蜂窝投资
- js访问对方手机文件夹_求JS大神帮我写个利用JS来实现手机端和PC端访问自动选择样式文件代码...
- yum安装:zabbix-web-4.2.8-1.el7.noarch: [Errno 256] No more mirrors to try
- C#解析JSON字符串总结(转载)
- 开源,阿里千万实例可观测采集器 iLogtail
- 关键字AUTO_INCREMENT 重命名表 修改列的属性。
- 编译原理 --- 正规式和有限自动机
- 【Oracle】Oracle错误 ora-12514 检查以及解决方法
- dropbox连接不上解决方法
- 2020牛客暑期多校训练营(第七场)J.Pointer Analysis
- stm32智能小车设计
- Unittest-单元测试3
- 【数据分析】互联网金融客户画像
- 堡垒机远程连接报“由于安全设置错误, 客户端无法连接到远程计算机. 确定你已登录到网络后,再重新连接” 错误处理步骤
- 让男生成熟的十部电影zt
- GopherChina第一天小结
- 一节计算机课作文500,难忘的一堂课作文500字5篇
热门文章
- h0283. 圆的周长
- 阿里P8架构大咖顷情力荐,“Java全线成长宝典”,从p5到p8一应俱全,跳槽大厂,弯道超车
- 中国人民大学与加拿大女王大学金融硕士——深度学习,创造不一样的人生好出路
- Android Auto 概述
- python基础教程第三版PDF
- Vben Admin
- 专为你收藏的漫画而生——Comic Collector 19 for Mac破解版
- php里drear_精通Dreamweaver CS3网站建设PHP篇
- 【C++学习】类与对象(下)
- U3D+ET6+IlRuntime 网络战棋游戏开发