背景

在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优化相关推荐

  1. android相机拍摄格式NV21,如何通过libyuv将NV21格式的android相机预览数据转换为i420?...

    public void onPreviewFrame(byte[] data, Camera camera) 我想libyuv到data转换为I420格式.看来NV21ToI420或ConvertTo ...

  2. android 预览和拍照成像方向不一致,Android相机预览方向深入探究

    原标题:Android相机预览方向深入探究 今日快讯 9月7日,北京市交通委召集各区管理部门和15家共享自行车企业负责人,听取共享自行车投放和管理的意见建议,研究决定并下发通知,暂停在本市新增投放共享 ...

  3. Android相机预览方向

    以前对Camera了解的不是太深入,最近有需求把人脸识别 集成到项目,必然会与Camera打交道,遇到一些坑,与大家分享一下. 一.预览方向   Camera.CameraInfo info = ne ...

  4. Android相机预览设置适配及显示方式

    Android相机的部分工作原理. 预览流程 相机预览是Android Camera最常用的功能之一,它是很多功能重要的输入,例如扫码.AR等. 一般而言,相机预览的整体流程,可以通过下图表示: 其中 ...

  5. Android相机预览页面被压缩和拉伸问题

    最近公司要求在原有的项目中添加一个扫码登录的功能,在调试好相机之后,发现相机返回到Surfaceview页面上的预览图片,与我们现实中物品的比例并不相同,在一块正方形的Surfaceview中,预览界 ...

  6. Android 相机方向传感,Nexus 5x反向横向传感器修复在Android相机预览...

    我是Android开发中的新手,所以如果我的问题很简单,我会提前道歉.在我的应用程序的一部分,我需要我的后置摄像头的实时预览,所以我创建了一个自定义类,扩展SurfaceView并实现SurfaceH ...

  7. Android 相机预览 横屏竖屏 -- 显示

    相机在设备上处于固定位置,无论设备是否 是手机.平板电脑或计算机.当设备方向更改时, 相机方向更改.常见的布局显示比率是 4:3. 对于前置摄像头,图像缓冲区逆时针旋转(从 传感器的自然方向) 对于后 ...

  8. Android相机预览,指定区域显示预览框,在区域内出现人脸进行人脸识别,并抓拍人脸照片存在本地,CameraX,虹软人脸识别

    效果图: 第一种是使用camerax进行预览,android camerax预览官方文档,主要通过imageAnalysis,抓帧进行图片处理,然后通过android自带的图片人脸识别FaceDete ...

  9. android相机预览拍照功能实现

    代码目录结构 LAUNCHER activity:CameraActivity : onCreate()方法中创建Camera工具类CameraHelper的实例并初始化: mCameraHelper ...

最新文章

  1. 复用io selectors模块
  2. 社区运营破冰也有三大原则八项注意“了,你造吗?
  3. sharepoint 弹出框
  4. 旅游服务商Bikego完成A轮融资,共建创投、马蜂窝投资
  5. js访问对方手机文件夹_求JS大神帮我写个利用JS来实现手机端和PC端访问自动选择样式文件代码...
  6. yum安装:zabbix-web-4.2.8-1.el7.noarch: [Errno 256] No more mirrors to try
  7. C#解析JSON字符串总结(转载)
  8. 开源,阿里千万实例可观测采集器 iLogtail
  9. 关键字AUTO_INCREMENT 重命名表 修改列的属性。
  10. 编译原理 --- 正规式和有限自动机
  11. 【Oracle】Oracle错误 ora-12514 检查以及解决方法
  12. dropbox连接不上解决方法
  13. 2020牛客暑期多校训练营(第七场)J.Pointer Analysis
  14. stm32智能小车设计
  15. Unittest-单元测试3
  16. 【数据分析】互联网金融客户画像
  17. 堡垒机远程连接报“由于安全设置错误, 客户端无法连接到远程计算机. 确定你已登录到网络后,再重新连接” 错误处理步骤
  18. 让男生成熟的十部电影zt
  19. GopherChina第一天小结
  20. 一节计算机课作文500,难忘的一堂课作文500字5篇

热门文章

  1. h0283. 圆的周长
  2. 阿里P8架构大咖顷情力荐,“Java全线成长宝典”,从p5到p8一应俱全,跳槽大厂,弯道超车
  3. 中国人民大学与加拿大女王大学金融硕士——深度学习,创造不一样的人生好出路
  4. Android Auto 概述
  5. python基础教程第三版PDF
  6. Vben Admin
  7. 专为你收藏的漫画而生——Comic Collector 19 for Mac破解版
  8. php里drear_精通Dreamweaver CS3网站建设PHP篇
  9. 【C++学习】类与对象(下)
  10. U3D+ET6+IlRuntime 网络战棋游戏开发