《打造极致二维码扫描系列》 -- ZXing开发详解

Android开发--Zxing库实现二维码/条形码扫描识别 阅读详情

什么是ZXing?


在Android平台做过二维码相关模块的肯定都熟知ZXing开源项目,ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE和Android。其GitHub地址是:传送门


ZXing项目里面代码很多,实现的功能也很多,我们的应用只需要剥离其中的扫描模块即可,再多一点也就是生成二维码的功能;接下来我们就一起来精简ZXing项目,最终形成一个小的Demo案例,当然江湖上已经有过N多种版本的ZXing精简项目,什么横屏改竖屏,绘制扫描界面,开启闪光灯等等,并且许多都是基于ZXing2.3.0来做精简的,后续有许多更新的版本,包括自动对焦,Camera管理,bug修复等等新功能;笔者使用的是ZXing3.1.0版本,这里需要说明的就是我的这版Demo绝对是江湖上面还没有出现的,也算是一点点小小的创新把,那就是去除ZXing项目中恼人的ViewFinderView的绘制,使用XML布局扫描界面,添加扫描动画,精确计算扫描区域,怎么样?是不是很心动,很想继续往下看呢?那就跟我一起做起来把!!!生气


克隆ZXing项目到本地


打开Git Base,敲入命令: git clone https://github.com/zxing/zxing.git

如下图所示:



当然你也可以直接点击Download ZIP



整理ZXing代码


打开ZXing项目的文件夹,可以看到如下文件:



其中我们主要关注2个文件夹里的内容: 

1. core : ZXing项目的核心代码,可以新建一个Java工程,然后export成jar来调用。如下图所示:



免打包即可获得的zxing-3.1.0.jar  猛戳下载 


2. android : Android示例工程代码,成功运行之后就是一个专业的扫码应用了。如下图所示:



免引入免整理的zxing原始工程 ZXingRawProject  猛戳下载


这么为你着想,还不感谢我么??!!偷笑得意

但是这样就让你满足了,那怎么可以说是极致二维码扫描呢,有木有感觉ZXing的扫描框的绘制很不爽啊?自定义的View绘制的很丑,多屏幕适配的时候还经常不兼容,原始项目还是横屏模式的,目前大家都习惯竖屏扫描呢。怎么办?别怕,我来告诉你,我要将ViewFinderView砍掉,使用xml界面布局,添加扫描动画,最终一样准确无误的扫描到二维码数据,只需要对准,是的,毫厘不差的对准就可以了。


精简ZXing代码,打造极致扫描


1. 去掉ZXing中一些和扫描无关的代码,最终留下的代码结构如下图所示,最关键的是你看不到ViewFinderView 了。爽了把,笑了吧,乐了吧。大笑



2. 布局扫描界面,xml代码如下:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:background="@android:color/transparent"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <SurfaceView  
  9.         android:id="@+id/capture_preview"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="match_parent" />  
  12.   
  13.     <RelativeLayout  
  14.         android:id="@+id/capture_container"  
  15.         android:layout_width="match_parent"  
  16.         android:layout_height="match_parent" >  
  17.   
  18.         <ImageView  
  19.             android:id="@+id/capture_mask_top"  
  20.             android:layout_width="match_parent"  
  21.             android:layout_height="120dp"  
  22.             android:layout_alignParentTop="true"  
  23.             android:background="@drawable/shadow" />  
  24.   
  25.         <RelativeLayout  
  26.             android:id="@+id/capture_crop_view"  
  27.             android:layout_width="200dp"  
  28.             android:layout_height="200dp"  
  29.             android:layout_below="@id/capture_mask_top"  
  30.             android:layout_centerHorizontal="true"  
  31.             android:background="@drawable/qr_code_bg" >  
  32.   
  33.             <ImageView  
  34.                 android:id="@+id/capture_scan_line"  
  35.                 android:layout_width="match_parent"  
  36.                 android:layout_height="wrap_content"  
  37.                 android:layout_alignParentTop="true"  
  38.                 android:layout_marginBottom="5dp"  
  39.                 android:layout_marginTop="5dp"  
  40.                 android:src="@drawable/scan_line" />  
  41.         </RelativeLayout>  
  42.   
  43.         <ImageView  
  44.             android:id="@+id/capture_mask_bottom"  
  45.             android:layout_width="match_parent"  
  46.             android:layout_height="wrap_content"  
  47.             android:layout_alignParentBottom="true"  
  48.             android:layout_below="@id/capture_crop_view"  
  49.             android:background="@drawable/shadow" />  
  50.   
  51.         <ImageView  
  52.             android:id="@+id/capture_mask_left"  
  53.             android:layout_width="wrap_content"  
  54.             android:layout_height="match_parent"  
  55.             android:layout_above="@id/capture_mask_bottom"  
  56.             android:layout_alignParentLeft="true"  
  57.             android:layout_below="@id/capture_mask_top"  
  58.             android:layout_toLeftOf="@id/capture_crop_view"  
  59.             android:background="@drawable/shadow" />  
  60.   
  61.         <ImageView  
  62.             android:id="@+id/capture_mask_right"  
  63.             android:layout_width="wrap_content"  
  64.             android:layout_height="match_parent"  
  65.             android:layout_above="@id/capture_mask_bottom"  
  66.             android:layout_alignParentRight="true"  
  67.             android:layout_below="@id/capture_mask_top"  
  68.             android:layout_toRightOf="@id/capture_crop_view"  
  69.             android:background="@drawable/shadow" />  
  70.     </RelativeLayout>  
  71.   
  72. </RelativeLayout>  

3. 计算截取区域(我认为你已经看了我的贴心注解内容了,否则。。。我不白啰嗦了么?鄙视)

贴心注解: 如果你没有看上一篇ZBar扫描中关于扫描区域计算的解释,那赶紧回去,咱不能急,看完再来接上,否则你会不理解的!传送门

[java]  view plain copy
  1. private void initCrop() {  
  2.     int cameraWidth = cameraManager.getCameraResolution().y;  
  3.     int cameraHeight = cameraManager.getCameraResolution().x;  
  4.   
  5.     /** 获取布局中扫描框的位置信息 */  
  6.     int[] location = new int[2];  
  7.     scanCropView.getLocationInWindow(location);  
  8.   
  9.     int cropLeft = location[0];  
  10.     int cropTop = location[1] - getStatusBarHeight();  
  11.   
  12.     int cropWidth = scanCropView.getWidth();  
  13.     int cropHeight = scanCropView.getHeight();  
  14.   
  15.     /** 获取布局容器的宽高 */  
  16.     int containerWidth = scanContainer.getWidth();  
  17.     int containerHeight = scanContainer.getHeight();  
  18.   
  19.     /** 计算最终截取的矩形的左上角顶点x坐标 */  
  20.     int x = cropLeft * cameraWidth / containerWidth;  
  21.     /** 计算最终截取的矩形的左上角顶点y坐标 */  
  22.     int y = cropTop * cameraHeight / containerHeight;  
  23.   
  24.     /** 计算最终截取的矩形的宽度 */  
  25.     int width = cropWidth * cameraWidth / containerWidth;  
  26.     /** 计算最终截取的矩形的高度 */  
  27.     int height = cropHeight * cameraHeight / containerHeight;  
  28.   
  29.     /** 生成最终的截取的矩形 */  
  30.     mCropRect = new Rect(x, y, width + x, height + y);  
  31. }  


4. 打完收工,验收效果



5. 完整项目代码: 猛戳下载


下一篇将介绍开篇博客中所说的一个完整的二维码一维码扫描的简单的APP

解锁未来:探秘Zxing二维码技术的神奇世界 Zxing是一项由Google开发和维护的开源二维码处理库,旨在为开发者提供强大而灵活的二维码识别、生成和解析功能。作为业界领先的二维码技术之一,Zxing在各个领域都有着广泛的应用。背景和起源:Zxing最初于2006年由Google工程师Sean Owen和其他贡献者创建,并于2007年开源发布。其名字来源于“zebra crossing”,意味着像斑马线一样将信息从纸质世界转移到数字世界。Zxing的初衷是为了简化二维码的处理和识别过程,使其更加普及和便捷。 阅读详情

相关推荐

《打造极致二维码扫描系列》 -- ZBar开发详解

什么是ZBar? 如果你是一个iOS开发

技术搬运工 2万+

使用zxing来生成二维码

在使用zxing生成二维码时,我们需要先准备好相关的依赖和jar包,并使用QRCodeWriter类来生成普通的二维码。无论是生成普通的二维码还是带有Logo的二维码,zxing都是一个非常实用的工具。而在二维码的生成过程中,zxing是一款非常优秀的开源库,它提供了一系列的API,可以帮助我们快速、方便地生成二维码。在使用zxing生成二维码之前,我们需要先下载zxing的jar包,并将其导入到项目中。除了普通的二维码之外,我们还可以生成带有Logo的二维码。三、生成带有Logo的二维码。

qinshengfei的专栏 6079

Android应用集成华为HMS Scankit:打造高效二维码扫描功能

本文详细介绍了在Android应用中集成华为HMS Scankit以打造高效二维码扫描功能的完整实践。相较于传统开源方案,Scankit凭借华为在影像与AI领域的积累,提供了识别速度快、暗光及复杂场景下成功率高的卓越体验。文章从环境配置、权限处理、核心API调用到高级功能(如自定义视图、本地图片识别)及常见避坑指南,为开发者提供了一份清晰的集成与优化指南。

rgv23456789的博客 236

zxing的使用及优化

二维码介绍 zxing项目是谷歌推出的用来识别多种格式条形码的开源项目,项目地址为https://github.com/zxing/zxing,zxing有多个人在维护,覆盖主流编程语言,也是目前还在维护的较受欢迎的二维码扫描开源项目之一。 zxing的项目很庞大,主要的核心代码在core文件夹里面,也可以单独下载由这个文件夹打包而成的jar包,具体地址在http://mvnreposit

lambert 7万+

二维码扫描技术全解析:从图像处理到工业应用实战

二维码扫描技术是计算机视觉与自动识别领域的重要应用,其核心原理是通过图像采集、预处理、定位与解码等步骤,将物理世界的二维码转换为数字信息。该技术的关键在于图像处理算法,如自适应阈值二值化、透视校正和里德-所罗门纠错码,这些算法确保了在复杂光照、遮挡等环境下仍能可靠解码。从技术价值看,二维码扫描不仅提升了信息交互效率,更是物联网、工业自动化的基础数据入口。在应用场景上,它已从简单的移动端“扫一扫”,扩展到零售自助结账、物流分拣、工业生产线追溯等多个领域。本文聚焦于二维码扫描器的核心架构,深入探讨了图像采集、预

weixin_42628573的博客 628

基于ESP32-P4的嵌入式视觉系统:打造高速低成本条码扫描器

嵌入式视觉系统通过集成图像传感器与处理器,在本地设备上实现实时图像采集与分析,其核心原理在于利用硬件加速与高效算法处理视觉数据。这项技术的价值在于为物联网设备赋予‘眼睛’,实现不依赖云端的本地化智能感知,从而在响应速度、数据隐私和系统可靠性上具备显著优势。在工业自动化、智能仓储和零售管理等应用场景中,嵌入式视觉是实现物品自动识别、信息录入与流程追溯的关键。本文聚焦于利用ESP32-P4芯片的MIPI-CSI接口和DMA2D硬件加速单元,构建一个高性能的条码与二维码扫描解决方案,深入探讨了从硬件选型、图像预处

weixin_30443075的博客 467

(转载)《打造极致二维码扫描系列》 -- ZXing开发详解

什么是ZXing? 在Android平台做过二维码相关模块的肯定都熟知ZXing开源项目,ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE和Android。其GitHub地址是: https://github.com/zxing/zxing ZXin...

weixin_30295091的博客 135

动态跳转与像素伪装:新型二维码钓鱼攻击的技术原理与防御

网络钓鱼攻击是一种利用社会工程学窃取用户敏感信息的常见威胁。其核心原理是通过伪造可信的登录界面或网站,诱导用户输入账号、密码等凭证。随着前端技术的发展,攻击手段不断升级,出现了结合动态跳转与像素级伪装的进阶手法,极大提升了攻击的隐蔽性和成功率。这类攻击的技术价值在于巧妙地利用了用户对首次跳转页面的信任消耗,以及移动端交互的特性,实现了对传统安全检测机制的规避。在应用场景上,它尤其针对移动端扫码的便捷性和屏幕信息展示的局限性,常伪装成App更新、活动入口或重要文件等诱饵。本文以“伪设计风”二维码钓鱼为例,深入

weixin_34384681的博客 500

Zxing二维码开发随笔

Zxing二维码开发随笔现在二维码扫描基本上是一个烂大街的功能了,正好项目中要用到,第一想到的自然就是谷歌的开源项目Zxing了,经过自己摸索和网上查阅资料折腾了两天,现在将开发中遇到的问题加以记录和总结。

Vioke的博客 1737

【深度解析】Zxing:开源条形码图像处理库的领航者

Zxing作为一款成熟且功能全面的开源条形码图像处理库,凭借其优秀的性能、广泛的格式支持和易用性,已成为众多企业和个人开发者在条形码识别和生成领域的首选工具。无论是初学者还是经验丰富的开发者,Zxing都能提供所需的一切,帮助你构建高效、可靠的条形码处理系统。未来,随着技术的不断进步,Zxing也将持续演进,为用户提供更多创新功能,推动条形码技术的发展。如果你正寻找一款强大而灵活的条形码处理库,Zxing无疑是最佳选择之一。

u013558123的博客 3294

SAP采购订单行项目增强实战:用BADI ME_GUI_PO_CUST添加自定义字段(避坑指南)

本文详细解析了如何通过BADI ME_GUI_PO_CUST在SAP采购订单行项目中添加自定义字段,包括技术架构理解、字段扩展步骤、自定义函数组创建及BADI实现。文章特别强调了避开官方文档未提及的陷阱,如字段映射限制和屏幕显示问题,并提供了高级优化技巧和性能建议。

weixin_30402343的博客 595

zBarLibary:终极Android二维码扫描与生成解决方案,比zxing快10倍!

zBarLibary是一款专为Android开发者打造的二维码与条形码处理工具库,它创新性地结合了zbar的高速扫描能力与zxing的本地生成识别功能,为移动应用提供了一站式的二维码解决方案。无论是需要快速集成扫码功能的新手开发者,还是追求极致性能的专业团队,都能从这个强大的库中获益。 ## 🌟 核心优势:为什么选择zBarLibary? ### ⚡ 闪电般的扫描速度 zBarLibary采

gitblog_00683的博客 429

C语言 在合并编译 ( 多.c文件 ) 情况下 实现 linked list ( 链表 ) 教程 . 更新ing

写在前面  依旧是参考借鉴了 浙江大学 温老师 的视频教程,很不错,在中国大学MOOC上,强力推荐!  虽说有借鉴,但是能保证的是每一行代码都是我自己经过理解后手敲出来的,所以才来做了这部分的教程。  最后,带 * 字符是我个人觉得可以添加的功能,按理来讲是可以不看的,而且大概率是可以有更好的改进的。  PS: 文章还在更新,如果文字蓝了(有超链接),说明写完了,如果没蓝,说明我在开军舰.jpg 源代码:  这里→源代码. 第一步:前置工作  先说一下每一篇都会出现 main 函数的,stage1 只是给没

weixin_47287635的博客 527

zxing性能优化秘籍:揭秘超快二维码扫描速度的实现原理

在移动应用开发中,二维码扫描功能的响应速度直接影响用户体验。基于zxing的扫一扫项目通过深度优化,显著提升了二维码识别效率,集成最新版本zxing-core.jar 3.3.3,实现了毫秒级扫描响应。本文将从技术层面解析其背后的性能优化原理,帮助开发者掌握打造极速扫码体验的核心方法。 ## 一、摄像头参数的智能配置策略 摄像头采集的图像质量直接决定解码速度,项目通过CameraManager

gitblog_00686的博客 999

FPGA之全数字锁相环(DPLL)

1. 数字锁相环的基本原理和组成 1.1 锁相环(PLL)的简介 锁相环最开始并不是用在数字电路中,而是模拟短路中。对于模拟电路中的锁相环,大家可以参考这篇文章稍微看一下,数字和模拟只是实现的方法不同,但是原理、步骤还是共同的。关于模拟PLL。可以参考一片文章: http://www.sohu.com/a/190569594_464086 首先在学习数字锁相环之前,我们应该先了解什么是锁相环?锁相...

DBLLLLLLLL的博客 5万+

Rclone替代RaiDrive?零广告免费挂载Alist WebDAV到Windows资源管理器(含自启脚本)

本文详细介绍了如何使用开源工具Rclone替代RaiDrive,实现零广告、全免费的Alist WebDAV挂载方案。通过深入解析配置参数、提供完整的自启动解决方案和解决常见问题,帮助用户在Windows资源管理器中高效管理云存储,提升使用体验。

weixin_33709364的博客 640

二维码扫描逻辑梳理

http://coolshell.cn/articles/10590.html(二维码生成细节及原理)http://blog.youkuaiyun.com/u012917700/article/details/52369175(二维码扫描及优化策略)http://blog.youkuaiyun.com/Tau_Chan/article/category/1846313(打造极致二维码详解)打开摄像头扫描二维码 拍照相关主要

珊瑚瞧的专栏 2937

别再花屏了!手把手教你用STM32CubeIDE搞定LVGL 8.3移植(附完整源码)

本文详细介绍了如何在STM32CubeIDE环境下成功移植LVGL 8.3,解决常见的花屏问题。从环境配置、显示驱动优化到编译警告处理,提供完整的实战方案和源码示例,帮助开发者快速实现流畅的嵌入式GUI界面。特别针对STM32平台的DMA2D加速和内存管理进行了深度优化。

weixin_33739646的博客 243

探索高效二维码识别新境界:QRCodeCameraX

探索高效二维码识别新境界:QRCodeCameraX 项目介绍 在数字化时代,二维码已成为信息传递的重要载体,从商品标签到门禁系统,无处不在。为了简化开发者的编码之旅,【QRCodeCameraX】应运而生,这是一个基于Android的轻量级二维码扫描解决方案。由开发者hglf匠心打造,并且遵循Apache 2.0许可证,确保你的项目能够无忧集成。它巧妙融合了Google的CameraX框架与zx...

gitblog_00072的博客 682

华为Atlas 300I推理卡驱动安装全攻略:从环境检查到常见问题解决

本文提供了华为Atlas 300I推理卡驱动安装的完整实战指南。从安装前的系统环境检查、内核版本匹配,到详细的二进制.run文件安装步骤、源码编译及高级定制化部署,涵盖了驱动安装的全流程。文章重点解析了安装过程中的关键决策、常见问题排查与解决方案,并针对生产环境的多卡配置、性能调优及安全加固给出了专业建议,旨在帮助用户高效、稳定地完成AI推理加速卡的部署。

swift5iosmith的博客 629

RD算法(一)初出茅庐 —— 算法原理

在《SAR成像概述》的第4节已经对各种SAR成像算法进行了一个简要的概述,本文就直接从RD算法讲起了。

5288

Android条码扫描及图片生成

Android条码扫描及图片生成 上周和老婆去超市,结账的时候老婆拿出手机拍的会员卡照片,但是怎么都扫不出来。于是就产生的做一个扫码应用的想法,并且可以把扫到的内容生成图片,方便使用。 Android条码扫描及图片生成简介 效果图 QA 1导入工程各种zxing的类找不到各种ClassNotFoundException 2从相册选择图片及剪切功能实现 3对imageview的bitmap手动回收

songdawww的博客 2654

量化 insider 爆料! 散户打板必亏?(打板必看!量化资金如何“隔日砸盘”收割散户)

量化开发 insider 爆料💥 散户追的涨停板📉,可能是机构故意做的陷阱!本文从技术视角拆解“涨停陷阱”,帮你看清市场真实逻辑🧠。

XiaoqiangClub的博客 455

如何在Chrome浏览器中快速生成与扫描二维码:终极免费插件指南

在数字化办公和移动互联时代,你是否经常遇到这样的困扰:想要将电脑上的网页链接快速分享到手机,却需要繁琐的复制粘贴;或者看到网页上的二维码,却担心直接扫描存在安全隐患?今天,我要为你介绍一款简单高效的解决方案——Chrome QRCode插件,这是一款免费的Chrome浏览器二维码生成与扫描工具,让你在浏览器内轻松完成二维码的所有操作。 Chrome QRCode是一款开源的Chrome插件,专为

gitblog_00632的博客 233

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 《打造极致二维码扫描系列》 -- ZBar开发详解
下一篇: AsyncTask与Thread+Handler的区别、AsyncTask的使用
codepython
博客等级 码龄20年 125粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值