通过《【搞定条形码】zxing项目源码解读(2.3.0版本,Android部分)》的分析,现在可以实现最终目标了:精简Barcode Scanner并将其中的编码和解码分离为两个独立的部分,方便日后快速集成到自己的项目中去。

编码

在上一篇分析中,对于编码部分已经有所透露,核心部分只有两个package。现在将分享的部分再去掉分享app、分享书签的功能,保留分享剪切板和分享联系人以及编码文本的功能:

编码部分的逻辑清晰,代码组织整齐,在前面了解zxing整体结构的基础上一直做减法即可。

精简过后该项目起名为XBarcodeGenerator

可以实现的功能包括:

  • 分享联系人

  • 分享剪切板

  • 编码输入文本

主界面布局稍稍修改了下,新增了一个按钮。代码托管至:Zxing-Simplification

解码

在Barcode Scanner的基础上,做出以下调整:

  • 去掉编码部分。去掉整个com.google.zxing.client.android.encode包及相应布局

  • 去掉分享部分。去掉com.google.zxing.client.android.share包及相应布局

  • 精简设置。去掉“自定义搜索网址”,修改前灯的描述,默认使用自动对焦,去掉搜索国家,没有持续关注

  • 调整横屏为竖屏展示

  • 美化viewfinderview(可选)

调整横屏为竖屏进行扫描共分为5步:

1. 调整CaptureActivity的方向为竖屏显示

修改AndroidManifest.xml中:

android:screenOrientation=“landscape"

android:screenOrientation="portrait"

2. 调整相机预览界面方向

在CameraConfigurationManager.setDesiredCameraParameters的最后增加一行代码:

camera.setDisplayOrientation(90);

调整相机preview的时钟方向与手机竖屏的自然方向一致。该方法必须在startPreview之前被调用,在预览界面展示出来后设置是无效的。

参考:Camera.setDisplayOrientation(int)

3. 调整扫描窗口尺寸

修改CameraManager.getFramingRectInPreview()中的

public synchronized Rect getFramingRectInPreview() {
...rect.left = rect.left * cameraResolution.x / screenResolution.x;rect.right = rect.right * cameraResolution.x / screenResolution.x;rect.top = rect.top * cameraResolution.y / screenResolution.y;rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;framingRectInPreview = rect;
...
}

修改为:

public synchronized Rect getFramingRectInPreview() {
...rect.left = rect.left * cameraResolution.y / screenResolution.x;rect.right = rect.right * cameraResolution.y / screenResolution.x;rect.top = rect.top * cameraResolution.x / screenResolution.y;rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;framingRectInPreview = rect;
...
}

由于修改了屏幕的初始方向,手机分辨率由原来的width*height变为height*width形式,但是相机的分辨率则是固定的,因此这里需做些调整以计算出正确的缩放比率。

4. 将扫描框设置为正方形

    public synchronized Rect getFramingRect() {if (framingRect == null) {if (camera == null) {return null;}Point screenResolution = configManager.getScreenResolution();if (screenResolution == null) {// Called early, before init even finishedreturn null;}int width = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH,MAX_FRAME_WIDTH);// 将扫描框设置成一个正方形int height = width;int leftOffset = (screenResolution.x - width) / 2;int topOffset = (screenResolution.y - height) / 2;framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);Log.d(TAG, "Calculated framing rect: " + framingRect);}return framingRect;}

让height=width即可

5. 反转扫描到的图形

修改DecodeHandler.decode方法,增加以下代码

private void decode(byte[] data, int width, int height) {long start = System.currentTimeMillis();Result rawResult = null;// 新增反转数据代码开始byte[] 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; width = height;height = tmp;// 新增结束PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(rotatedData,width, height);if (source != null) {BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));try {// 预览界面最终取到的是个bitmap,然后对其进行解码rawResult = multiFormatReader.decodeWithState(bitmap);} catch (ReaderException re) {// continue} finally {multiFormatReader.reset();}}
...

如果要仿照微信做一个扫描窗口,可参考《基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果》

精简过后该项目起名为XBarcodeScanner,代码托管至:Zxing-Simplification

[转]【基于zxing的编解码实战】精简Barcode Scanner篇相关推荐

  1. 【基于zxing的编解码实战】初识条形码

    2019独角兽企业重金招聘Python工程师标准>>> 条形码定义     条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符 ...

  2. 音频编解码·实战篇(1)PCM转至AAC(AAC编码)

    音频编解码·实战篇(1)PCM转至AAC(AAC编码) 作者:柳大·Poechant 博客:blog.csdn.net/poechant 邮箱:zhongchao.ustc@gmail.com 日期: ...

  3. 音视频-视频编/解码 实战

    先来简单看下 音视频的采集 . 一.音视频的采集 音视频采集的核心流程: 音/视频采集 用到的视频输出的类是AVCaptureVideoDataOutput,音频输出的类是AVCaptureAudio ...

  4. 【语音编码】基于matlab ADPCM编解码(Matlab代码实现)

  5. 从编解码、传输到基础架构 详解Bigo多媒体技术栈

    本文来自Bigo多媒体技术团队的投稿,详细介绍了Bigo多媒体技术的前生今世,通过何种技术手段支撑起了BigoLive.Likee和imo三大业务.技术栈具体涉及编解码.传输.全球基础设施架构等三方面 ...

  6. 视频编解码和MPEG4编码

    来自 http://blog.csdn.net/dansin/article/details/389149 MPEG-4编解码学习. 1.视频数据编码的办法对数据进行编码的目的前面以前提过,一方面降低 ...

  7. 视频编解码技术发展趋势

    注:个人理解,仅供参考,如有其他看法,欢迎一起讨论! 01 发展历史 视频编解码技术的发展已有数十年时间了,目前成熟的技术均为以块划分和预测变换技术为基础的框架 而90年代以来,国际视频编解码标准也经 ...

  8. Python基于AIML智能聊天机器人实战(4)- 机器人自学习能力集成

    一.前言 本文是<Python基于AIML智能聊天机器人实战>第四篇:AIML自学习能力集成: AIML是智能对话机器人具有里程碑意义的开源项目,曾斩获多项国际大奖,是基于检索技术的闲聊式 ...

  9. Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码

    Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 客户端启动流程 实战: 客户端和服务端双向通信 数 ...

  10. 基于ZXing Android实现生成二维码图片和相机扫描二维码图片即时解码的功能

    NextQRCode ZXing开源库的精简版 **基于ZXing Android实现生成二维码图片和相机扫描二维码图片即时解码的功能 原文博客 附源码下载地址** 与原ZXingMini项目对比 N ...

最新文章

  1. 使用DDMS中的内存监测工具Heap来优化内存
  2. 中国联通:基于SOC的MSS实践
  3. javascript函数调用的各种方法!!
  4. JDK Executor执行器的应用
  5. ubuntu安装vncserver实现图形化访问
  6. 要是有力气的话可以做装卸工,月入过万不是梦
  7. Zookeeper C API 指南二(监视(Wathes), 基本常量和结构体介绍)
  8. LAMMPS分子动力学模拟技术及应用
  9. 黑马程序员——高新技术(银行业务调度系统)
  10. 图形学空间坐标变化之二维图形观察及变换
  11. 查看linux内存大小
  12. php7 memcached sasl,memcached sasl
  13. 2021年12月电子学会图形化四级编程题解析含答案:聪明的小猫
  14. 湖南邮储银行计算机类的是不是不要看金融知识,邮储银行一题一分,侧重专业还是行测?...
  15. [bitfinex]自动放贷小程序炮制过程描述
  16. 网络封包分析软件-wireshark
  17. Debian字体美化
  18. 【论文阅读】视线估计方向论文
  19. 【Python】PDF文档导出指定章节为TXT
  20. 组织结构中岗位和角色的体系

热门文章

  1. Atitit. servlet 与 IHttpHandler  ashx  listen 和HttpModule的区别与联系 原理理论 架构设计   实现机制    java php c#.net j
  2. PAIP.http post 400错误
  3. 软件的黑盒和白盒分析方法
  4. Julia : varinfo() 与工作空间,@isdefined, @which
  5. 云原生数据仓库从托管到原生的演进实践
  6. 让数据更安全可用,阿里云存储多项新功能发布
  7. OpenStack基金会任命马振强为中国区大使
  8. 【雷达测角】基于matlab和差波束加权【含Matlab源码 1674期】
  9. 【手写数字识别】基于matlab GUI知识库手写数字识别(写字板+图片)【含Matlab源码 1227期】
  10. 【优化求解】基于matlab粒子群算法求解函数极值问题【含Matlab源码 1202期】