不得不说这个过程看上去简单,实际上写到我差不多一个星期的时间,由于超出预定时间,此功能被放弃,出于对技术的追求,于是继续写,终于被我弄出来。
其实两种方法的本质都是通过byte[]data获取数据,通过camera获取长宽。扫码过程中主要由两种途径:
1.camera.takePicture(自己写回调,灵活性相对高,推荐)
2.camera.setPreviewCallback(最终通过handler传递到DecodeHandler里面的decode())

说说思路-方法1:拍照

1.使用camera拍照

2.把拍照的data格式转换进行保存

听上去很简单吧?那我们试一下。
我的手机是mi5x,看看效果:
预览效果:

拍摄图片:

takePicture回调:

public void takePicture(final TakePictureCallback callback){if (camera != null && previewing) {camera.takePicture(null, null, new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {byte[] rotatedData = new byte[data.length];Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);Matrix matrix = new Matrix();matrix.setRotate(90);int width = bitmap.getWidth();int height = bitmap.getHeight();bitmap = createBitmap(bitmap, 0, 0, width, height, matrix, true);File file = new File(Environment.getExternalStorageDirectory() + File.separator + "mCamera", "b.jpg");saveBitmap(file.getAbsolutePath(), bitmap);if(callback!=null)callback.callback();}});}}

这个效果看的我n脸懵逼,摄像头怎么了?怎么拍摄的照片不完整?随后换了其他手机,如华为,vivo又不会有这样的问题,拍摄图片显示正常。几经周折,终于在不断尝试下找到解决办法:
摄像头初始化setPreviewSize前,要使用setPictureSize:

Camera.Parameters parameters = camera.getParameters();List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();int position =0;if(supportedPreviewSizes.size()>2){position=supportedPreviewSizes.size()/2+1;//supportedPreviewSizes.get();}else {position=supportedPreviewSizes.size()/2;}int width = supportedPreviewSizes.get(position).width;int height = supportedPreviewSizes.get(position).height;Log.d(TAG, "Setting preview size: " + cameraResolution);parameters.setPictureSize(width,height);camera.setDisplayOrientation(90);cameraResolution.x=width;cameraResolution.y=height;parameters.setPreviewSize(width,height);setFlash(parameters);setZoom(parameters);//setSharpness(parameters);camera.setParameters(parameters);

估计setPictureSize就是实际拍摄的大小了,没有设置就会按照默认的来,小米这里可能又挖坑了。
另:实测发现vivo手机等加入setPictureSize后可能会在解码旋转图片过程中出现ArrayIndexOutOfBoundsException问题,如果碰到可能需要识别手机型号,小米才进行setPictureSize,其他手机采用默认【这方面可能需要查更多的资料,现在找到的信息有限】。

java.lang.ArrayIndexOutOfBoundsException: length=4147200; index=4913280

说说思路-方法2:扫码解码后直接保存

zxing的DecoderHandler里面有一个decode()方法用于解码,里面可以拿到data和长宽,可以直接在此处保存。

步骤1:使用传过来的原始长宽以及data

步骤2:进行解码保存在文件中

使用renderCroppedGreyscaleBitmap,图变灰:

public Bitmap renderCroppedGreyscaleBitmap() {int width = getWidth();int height = getHeight();int[] pixels = new int[width * height];byte[] yuv = yuvData;int inputOffset = top * dataWidth + left;for (int y = 0; y < height; y++) {int outputOffset = y * width;for (int x = 0; x < width; x++) {int grey = yuv[inputOffset + x] & 0xff;pixels[outputOffset + x] = 0xFF000000 | (grey * 0x00010101);}inputOffset += dataWidth;}Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, width, 0, 0, width, height);return bitmap;}

成功变成黑白照。

另外说说为什么用原始长宽和data。在zxing解码这个部分,我们通常会看到这样一段代码:

Result rawResult = null;//modify herebyte[] rotatedData = new byte[data.length];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++)rotatedData[x * height + height - y - 1] = data[x + y * width];}int tmp = width; // Here we are swapping, that's the difference to #11width = height;height = tmp;

这是解码前做的准备,简单的说就是把图片进行了一下翻转,但如果是截图,请不要直接使用这个rotateData以及转换之后的长宽,否则效果如下:


【这张图本身也很奇怪,用手机看是全的,用电脑看下面变灰色】

由上面两个结果得出的结论是:

1.保存时候图片先不要旋转

2.不要使用renderCroppedGreyscaleBitmap()进行图片保存

于是用了原始参数,是这样传的:

source.renderCroppedGreyscaleBitmap2(data,height,width,file.getAbsolutePath());

内部如下:

public void renderCroppedGreyscaleBitmap2(final byte[] data, int width, int height, String path) {FileOutputStream outStream = null;try {YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21,width,height,null);ByteArrayOutputStream baos = new ByteArrayOutputStream();yuvimage.compressToJpeg(new Rect(0,0,width,height), 100, baos);outStream = new FileOutputStream(path);outStream.write(baos.toByteArray());outStream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {}}

得到图片:


可以看到是彩色的,选择的方式上面有贴出,建议新开线程来处理,这里再贴一下:
路径获取bitmap:

FileInputStream fis = new FileInputStream(path);
Bitmap bitmap  = BitmapFactory.decodeStream(fis);

旋转:

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);Matrix matrix = new Matrix();matrix.setRotate(90);int width = bitmap.getWidth();int height = bitmap.getHeight();bitmap = createBitmap(bitmap, 0, 0, width, height, matrix, true);

保存:

public static String saveBitmap(String dir, Bitmap b) {try {File f = new File(dir);if (f.exists()) {f.delete();}f.createNewFile();FileOutputStream fout = new FileOutputStream(f);BufferedOutputStream bos = new BufferedOutputStream(fout);b.compress(Bitmap.CompressFormat.JPEG, 100, bos);bos.flush();bos.close();return dir;} catch (IOException e) {e.printStackTrace();}return "";}

Android zxing扫码截彩色图相关推荐

  1. android zxing扫码 生成二维码

    zxing 实现生成二维码,扫码 demo:https://download.csdn.net/download/chengtaoyan/11170917

  2. Zxing扫码库优化思路

    /   今日科技快讯   / 近日,抖音直播发布<抖音关于打击直播诈骗黑色产业链的公告>.公告称,为进一步保障用户及平台安全,抖音下阶段将重点推进MCN治理.帐号治理等专项行动.同时,将于 ...

  3. 【Android】zxing扫码识别及生成二维码

    在我们的生活场景中扫码已经无处不见了,微信加好友,分享......甚至在骗子的骗术里面都加入二维码这个东西.还是想在这里提醒大家不要看着什么扫描二维码抢红包,领礼品,就急急忙忙的拿起手机去扫. 今天让 ...

  4. android 动态扫码框,Android 一行代码接入扫码功能 (CameraX + zxing)持续更新....

    怎么集成: 1.在根目录的build.gradle中添加jitpack依赖: allprojects { repositories { maven { url "https://jitpac ...

  5. android 实现扫码功能,Android | 带你零代码实现安卓扫码功能

    小序 这是一篇纯新手教学,本人之前没有任何安卓开发经验(尴尬),本文也不涉及任何代码就可以使用一个扫码demo,华为scankit真是新手的福音-- 背景介绍 最近被导师要求做一个购物收费的app,毕 ...

  6. Android连扫码盒子,商米扫码盒正式上市,为解决扫码支付痛点而生

    原标题:商米扫码盒正式上市,为解决扫码支付痛点而生 近年来,随着移动支付的兴起,有越来越多的消费者使用微信.支付宝等方式进行付款,扫码支付备受青睐.为了迎合消费者扫码支付的需求,商家不得不使用扫码支付 ...

  7. 集成zxing扫码解决二维码自动放大

    只需要在跳转的时候添加intent.putExtra("autoEnlarged", true);即可: // 扫码 Intent intent = new Intent(); i ...

  8. android 魅族扫码,魅族Flyme8扫码快传太实用,轻松实现文件高速传输

    原标题:魅族Flyme8扫码快传太实用,轻松实现文件高速传输 在经过了几个月的内测之后,一直在热销的魅族16T手机也迎来了Flyme8 稳定版的更新,在流畅度和交互方面带来了较大的提升,进一步提升了用 ...

  9. Android 微信扫码登陆

    最近项目需求中有一个微信扫码登陆功能,即用手机微信扫码功能扫描终端二维码实现登陆的功能 随即打开微信开发者文档查看,不亏为官方,简洁明了,看得我是一脸懵逼,踩了N多坑,太不友好了,言归正传,希望对一些 ...

最新文章

  1. 如何优雅地退出python程序
  2. 深入理解.net服务器控件
  3. android 引用路径,android – ClassLoader引用了未知路径:/ data...
  4. vue render函数
  5. 串口服务器应用领域及应用方案详解
  6. [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause 的问题 MySQL
  7. tps+qps+mysql_实时获取MySQL的TPS、QPS(输出到屏幕)
  8. win32开发(鼠标)
  9. 奇安信代码安全实验室帮助谷歌修复高危漏洞,获官方致谢
  10. 5.1 Attention(注意力)概述 原理、作用、计算流程
  11. 磁盘上没有足够的空间完成此操作_Win10硬盘怎么分区?Win10系统下新建磁盘分区图解教程...
  12. 自定义View:Android 仿 PS 选色板
  13. 哪些论文需要用到知网vip检测系统呢?
  14. 【吐血整理】那些让你起飞的计算机基础知识:学什么,怎么学?
  15. 关于北京摇号概率的相关计算
  16. 区块链:以太坊白皮书
  17. 短信验证-1基本的服务器环境搭建
  18. 无法访问gcr.io的解决办法
  19. 人工智能产业链,是时候梳理一下了!
  20. 人工智能在刷题学海战术中的作用

热门文章

  1. Egret 之消除游戏开发 PART 5-张鑫磊-专题视频课程
  2. 什么叫做计算机云,什么是云电脑?
  3. android 小影app,小影视频制作软件
  4. 王者荣耀账号转服务器,《王者荣耀》账号怎么转区 账号转区方法
  5. android studio 项目两个build.gradle的解析
  6. 总结安卓各大版本(4.0-11.0)的区别、新特性
  7. PU Learning-two stage approach(两阶段法)-S-EM
  8. 困扰前端的像素相关概念:PPI、DPI、设备像素、独立像素
  9. 自制「空调控制系统」的方式
  10. python中elif语句_Python学习笔记控制流语句之elif语句