说起二维码扫描,估计很多人用的是 zxing 吧。

然而 zxing 虽然好用,但是却有一些坑。

这边分析一下自己实际项目遇到的一个坑。

什么坑呢?

下面举个栗子你就懂了。

这边生成二维码使用的是网络上的一个网站联图

以百度为例,正常情况生成的二维码如下:

这种情况下用 zxing 分分钟就可以识别出来。

但是假设我将前景色和后景色调换,生成的二维码如下:

这种情况下 zxing 就识别不出了。

所以说这种时候就很无奈了。毕竟有些场景就需要用到反转二维码。

所以本篇说的 zxing 的坑就是无法识别反转二维码

咋办呢?凉拌。

这种时候就需要去源码看看了。

看一下二维码解析的代码逻辑在哪?

通过一番折腾,跟踪调试,最后定位到如下位置:

https://github.com/zxing/zxing/blob/master/android/src/com/google/zxing/client/android/DecodeHandler.java#L80

关键代码:(DecodeHandler.java 里面的 decode 方法)

BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

如果要识别上面的反转百度二维码,需要如何处理呢?

很简单,只需要将上面的代码改为:

BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source.invert()));

即可。

到了这里,相信聪明的你应该知道如何让 zxing 同时支持两种格式了。

只需要设置一个计数器,然后在指定次数(比如前 3 次)里面使用

BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

在另外次数(比如后 3 次)里面使用

BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source.invert()));

交替使用即可。

这样就可以解决正转和反转二维码的识别了。

NOTE:

  1. 通过交替识别可能会降低识别速度,因此次数设置为多少需要自己调试把控。
  2. 计数时注意避免次数溢出。

如果你有其他方法,欢迎留言讨论。

zxing 如何识别反转二维码的更多相关文章

  1. 【转】Delphi+Halcon实战一:两行代码识别QR二维码

    Delphi+Halcon实战一:两行代码识别QR二维码 感谢网友:绝代双椒( QQ号应原作者要求隐藏了:xxxx6348)的支持 本文是绝代双椒的作品,因为最近在忙zw量化培训,和ziwang.co ...

  2. 【java】google的zxing架包生成二维码和读取二维码【可带文字和logo】

    承接RC4生成不重复字符串的需求之后,因为优惠码要方便用户使用的缘故,所以思来想去,觉得还是直接生成二维码给用户直接扫比较实用,也不用用户专门记录冗长的优惠码编号. ================= ...

  3. com.google.zxing.NotFoundException-识别图片二维码信息错误

    一.问题由来 自己在做一个小程序项目的后台,其中需要使用到识别图片二维码信息,而且是必须在Java后台进行识别二维码操作.去百度里面很快找到一个方法, 可以识别简单的二维码,而且自己生成的简单的二维码 ...

  4. 在Android上使用ZXing识别条形码/二维码

    越来越多的手机具备自动对焦的拍摄功能,这也意味着这些手机可以具备条码扫描的功能.......手机具备条码扫描的功能,可以优化购物流程,快速存储电子名片(二维码)等. 本文使用ZXing 1.6实现条码 ...

  5. ZXing 生成、读取二维码(带logo)

    前言 ZXing,一个支持在图像中解码和生成条形码(如二维码.PDF 417.EAN.UPC.Aztec.Data Matrix.Codabar)的库.ZXing(“zebra crossing”)是 ...

  6. zxing生成和解析二维码

    今天忙了一天的二维码,用了QRcode和ZXing两个开源包.结果发现 ZXing比QRcode更好用一些,它直接可以定义二维码生成图案的大小,而QRcode生成的二维码是根据二维码包含的内容多少来定 ...

  7. ZXing 生成、解析二维码图片的小示例

    概述 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME ...

  8. ZXing生成条形码、二维码、带logo二维码

    采用的是开源的ZXing,Maven配置如下,jar包下载地址,自己选择版本下载,顺便推荐下Maven Repository <!-- https://mvnrepository.com/art ...

  9. 使用Google ZXing生成和解析二维码

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

随机推荐

  1. 从零搭建基于golang的个人博客网站

    原文链接 : http://www.bugclosed.com/post/14 从零搭建个人博客网站需要包括云服务器(虚拟主机),域名,程序环境,博客程序等方面.本博客 就是通过这几个环节建立起来的, ...

  2. Spring mvc 上传进度条实现

    以下的仅仅是学习而已,记录以下笔记 1 springmvc 进度条,要实现ProgressListener接口,实现方法update(long readLength, long contextLeng ...

  3. Postman----Presets(预先设置)的使用

    使用场景: 当我们在进行接口测试post请求时,headers是必填项,我们将一个A接口的headers编写后测试完成,再次进行B接口的测试,需重新编写headers,为了简单操作,我们就用到了Pre ...

  4. Python+Appium 获取 toast 文本值方法的封装

    获取toast内容方法封装如下: def get_Toast(self,message): #查找toast值 ''' method explain:查找toast的值,与find_Toast实现方法 ...

  5. 【机器学习基础】熵、KL散度、交叉熵

    熵(entropy).KL 散度(Kullback-Leibler (KL) divergence)和交叉熵(cross-entropy)在机器学习的很多地方会用到.比如在决策树模型使用信息增益来选择 ...

  6. 如何使用FluentMigrator进行数据库迁移

    标题:如何使用FluentMigrator进行数据库迁移 地址:https://www.cnblogs.com/lwqlun/p/10649949.html 作者: Lamond Lu FluentM ...

  7. 什么是TensorFlow?

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面: 从零开始学TensorFlow[01-搭 ...

  8. 【3y】从零单排学Redis【青铜】

    前言 只有光头才能变强 最近在学Redis,我相信只要是接触过Java开发的都会听过Redis这么一个技术.面试也是非常高频的一个知识点,之前一直都是处于了解阶段.秋招过后这段时间是没有什么压力的,所 ...

  9. 详解synchronized与Lock的区别与使用

    知识点 1.线程与进程 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程.关系是线程–>进程–>程序的大致组成结构.所以线程是程序执行流的最小单位 ...

  10. Dynamics 365 CE中使用FetchXML进行聚合运算

    微软动态CRM专家罗勇 ,回复328或者20190429可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Dynamics 365 Customer Engagement ...