zxing 如何识别反转二维码

作者: 安卓小煜 | 来源:发表于2018-07-23 09:44 被阅读19次

    说起二维码扫描,估计很多人用的是 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. 计数时注意避免次数溢出。

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

    相关文章

      网友评论

      • JarryLeo:我觉得叫反色二维码准确一点

      本文标题:zxing 如何识别反转二维码

      本文链接:https://www.haomeiwen.com/subject/vtfqmftx.html