Zxing库解析类源码分析(不含算法)

使用ZXing.Net开源识别二维码 使用ZXing.Net开源识别二维码,显示二维码图片和二维码信息。 阅读详情

介绍

Zxing库是目前在Android开发中使用率比较高的一维/二维码识别的开源库。相较于实现了同样功能的Zbar库,Zxing的所有功能都是通过Java代码实现的,这点对于Android开工程师来说很友好。另外由于Zbar的开源项目长期没人维护,所以如果出现问题或者需要做定制,会非常困难。

下面会根据自己在实际项目中针对Zxing库的定制和修改,主要对Zxing库的二维码识别的流程以及核心源码进行解读,一维码的解析流程比较简单,不做介绍。由于能力有限,会指出核心方法中算法的意义,但是不会深究解读其中的算法实现。

流程图二维码识别的流程图

核心类说明及核心方法分析

LuminanceSource

我们在使用Zxing时,首先要获得一张/一帧图片的位图数据,也就是一个byte数组,然后将图片信息传递给LuminanceSource。这个类的主要功能将我们传入的图片数据裁剪为一个只含有识别区域数据的矩形。

LuminanceSource是一个抽象类,下面有三个子类,三个子类是根据我们传入的数据源的不同进行分类的,其功能如下:

  • RGBLuminanceSource :传入的流数据格式为RGB类型,主要应用场景是解析本地文件。
  • PlanarYUVLuminanceSource :传入的流数据格式为YUV类型,主要应用场景是解析摄像头返回的数据。
  • InvertedLuminanceSource : 将传入的数据进行旋转,外部一般不会调用。

这三个类中,我们拿PlanarYUVLuminanceSource来看看他的构造方法(RGBLuminanceSource与其类似):

public PlanarYUVLuminanceSource(byte[] yuvData, //传入的帧数据
                                  int dataWidth, //数据源图片宽度
                                  int dataHeight, //数据源图片高度
                                  int left, //识别区域的左边距
                                  int top, //识别区域的上边距
                                  int width, //识别区域的宽度
                                  int height, //识别区域的高度
                                  boolean reverseHorizontal //是否需要旋转图片
                                  )

在这个构造方法中,我们一般不会使用到reverseHorizontal这个参数,默认传false,需要我们注意到的参数是left和top,因为这两个参数是裁剪区域相对于传入流的位置,而摄像头返回的流数据可能是横屏或者竖屏的,在不对流进行旋转操作的前提下,这两个参数在传值时是不同的,具体说明可查看下面的 注意事项

这个类的核心方法有两个:

  • getMatrix() : 获取裁剪后的二维的位图数据
  • getRow() : 获取裁剪后某一行的位图数据

上面的后两个是核心方法,其核心代码和说明如下:

  @Override
  public byte[] getRow(int y, byte[] row) {
    //数据纠错
    if (y < 0 || y >= getHeight()) {
      throw new IllegalArgumentException("Requested row is outside the image: " + y);
    }
    //创建一个空的裁剪区域大小的数组
    int width = getWidth();
    if (row == null || row.length < width) {
      row = new byte[width];
    }
    //计算裁剪区域的偏移量
    int offset = (y + top) * dataWidth + left;
    //从流数据中取出对应裁剪区域,指定行的位图数据
    System.arraycopy(luminances, offset, row, 0, width);
    return row;
  }

  @Override
  public byte[] getMatrix() {
    int width = getWidth();
    int height = getHeight();

    //如果发现不需要裁剪,直接返回
    if (width == dataWidth && height == dataHeight) {
      return luminances;
    }

    //创建一个空的裁剪区域大小的数组
    int area = width * height;
    byte[] matrix = new byte[area];

    //计算裁剪区域的偏移量
    int inputOffset = top * dataWidth + left;

    //如果不在x轴上进行裁剪
    if (width == dataWidth) {
      System.arraycopy(luminances, inputOffset, matr
Android 详解使用 Zxing实现前置摄像头扫描二维码、生成二维码 现在二维码使用越来越广泛了,几乎处处可见,并且 公司相关的项目中几乎全部都和二维码扫描有关,所以总结一下自己的使用心路历程,总觉得要做点什么来记录自己的成长,让自己的成长有迹可循,如果恰好能够帮助到你,我当然会很开心啦。 废话结束,正文开始 Android中常用的就是zxing,开源项目地址:https://github.com/zxing/zxing 一、 二、 三、 四、 ... 阅读详情

相关推荐

Android二维码扫描模块可简单集成(基于ZXIng实现)

Android二维码扫描模块可简单集成(基于ZXing实现)

M075097的博客 6528

Java二维码与条形码生成详解:ZXing、QRGen与Barcode4J实战代码示例

总结来说,ZXing提供了全面的二维码和条形码生成与解析能力,而QRGen则提供了简洁的API专门用于生成高质量的QR Code。在Java开发中,生成二维码和条形码通常依赖于第三方,这些封装了复杂的数据编码算法和图像生成过程,使得开发者只需通过简单易用的API就能快速创建所需条码或二维码。是一个专注于生成高质量QR Code的轻量级Java,它提供了一种简洁的API,允许用户快速生成二维码,并支持自定义颜色、大小等属性。,并附带详尽的代码示例及注释,以帮助理解如何使用它们来生成二维码和条形码。

java专栏 2836

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

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

u013558123的博客 3272

Android二维码的扫描与生成(zxing

2.集成java源码,将demo工程QrScan中app/src/main/java/目录下包中的zxing和util复制到此工程对应的app/src/main/java的包下。layout复制activity_capture.xml,activity_scanner.xml,toolbar_scanner.xml。values复制/替换其中的attrs.xml,ids.xml,colors.xml。1.将获取的jar包复制到工程的app/libs目录下,刷新,然后去添加依赖。...

Ai1114的博客 3万+

深入理解与应用Zxing条形码和二维码解决方案

本文还有配套的精品资源,点击获取 简介:Zxing是一个开源的多平台条形码和二维码读取,支持包括QR Code、Data Matrix、UPC、EAN等多种格式。该简化了条码处理过程,允许开发者在应用中集成扫描功能。本文将探索二维码技术、ZxingAndroid开发中的应用、源码分析、工具使用以及 KeysenseBar 示例项目,使开发者能够通过实际案...

weixin_35294091的博客 6057

ZXing源码解析一:让源码跑起来

前言:因为公司用的扫码ZXing,但是在使用的时候发现存在一些问题,所以就想分析一下源码,搞清楚ZXing解析二维码的原理和步骤,然后再进一步对ZXing进行一些优化。 下载源码   ZXing是开源的,可以直接在github下载源码阅读,源码地址在这里,可以用git命令将源码clone道本地,如图 从上图中可以发现源码有200多兆,当然这两百多兆不仅有源码,还有一些文档什么的。源码下载...

weixin_33804582的博客 765

zxing源码分析——扫码流程分析

一 前言 zxing用于Java、Android的条形码扫描,我们日常使用的APP中的二维码扫码功能绝大对数都是基于zxing项目做二次开发的,本文就此对zxing源码进行深入分析。 1.1 zxing 目录结构 zxing github目录文件较多,但其实我们只需要查看android-core、android、core三个文件夹即可。 android-core:这里面只有一个,包含配置Android摄像头的一些实用方法。 androidAndroid扫码二维码的Demo,也就是需要我们重点分析的

qq_39431405的博客 5015

ZXing源码解析二:掌握解码步骤

前言:上篇文章已经让源码运行起来了,但是还存在很多与扫描二维码无关的代码,本篇将删除无用的代码只保留与扫码有关的代码,同时分析解码的步骤。 精简代码   本篇文章的目标是分析出解码的步骤,为了不被无关的代码干扰,将会对源码进行精简,只保留与解码有关的代码。   主要删减的代码就是识别出二维码的内容后,一些其他的操作,如分享,记录扫描的历史,搜索解析结果等。删除之后的android模块的结构如下...

fnhfire_7030的博客 1912

ZXing 源码分析(简阅)

导读 虽然有句话在程序员中说:”别人造好的轮子,不要重复发明轮子”,但是只会用别人的东西,对自己个人技术的提升也是不可能的0.0 那么最好的方式就是看源码. 本篇文章就是个人在使用ZXing后看官方Demo源码的读后感,有不对的地方欢迎评论指出,一起讨论.

默小铭的博客 5531

zxing源码分析——QR码部分

Android应用横竖屏切换   zxing源码分析——DataMatrix码部分 zxing源码分析——QR码部分   2013-07-10 17:16:03|  分: 默认分 |  标签: |字号大中小 订阅 Java代码结构: zxing源码的结构还是比较清晰的,有关QR码的代码主要在以下几个package中。Java代

chonbj的专栏 1万+

源码解析zxing条码边距及总宽度计算规则,附java使用zxing生成条形码,并去除条码两边空白

ZXing(“zebra crossing”)是一个用Java实现的开源,多格式1D / 2D条形码图像处理,具有其他语言的端口。 如果不想看源码分析,想直接看代码请跳到最后!!! 常用的Code 128 码与 Code 39 码比较: Code 128 码与 Code 39 码都广泛运用在企业内部管理、生产流程、物流控制系统方面。不同的在于 Code 128 比 Code 39 能表现更...

白鸿源的博客 5791

ZXing开源条码扫码源码解析与实战开发

ZXing(发音为“zebra crossing”)是一个开源的、跨平台的条码图像处理,广泛用于二维码与条形码的编码与解码任务。其最初由Google发起并维护,现已成为Java生态中最为流行的条码处理解决方案之一。ZXing采用模块化设计,核心模块(core)作为最底层模块,负责提供基础功能,如图像处理、编码解码算法、条码格式定义等。其设计目标是保持高度可移植性,便于在不同平台和语言中复用。定义了ZXing支持的所有条码格式,如QR Code、Data Matrix、UPC-A等。

weixin_33239721的博客 671

二维码zxing源码分析(二)decode部分

在上一篇博客中分析了zxing怎么打开摄像头,并且扫描结果,那么扫描之后的数据呢,是不是就要解析了呢,那我们看一下zxing怎么解析这个数据的。 上一篇博客地址ZXING源码分析(一)CAMERA部分。 首先看一下解码涉及到的 一、com.google.zxing.client.android.camera.PreviewCallbac...

weixin_30622181的博客 519
上一篇: Android 7.0 & 8.0 升级兼容
下一篇: Camera使用详解
ICodeMan
博客等级 码龄11年 9粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值