【问题标题】:QR code generated by Android zxing library doesn't scan with most QR code scannersAndroid zxing 库生成的二维码无法使用大多数二维码扫描仪进行扫描
【发布时间】:2013-02-13 03:49:25
【问题描述】:

我发布此内容是为了回答我自己的问题(以防万一其他人遇到此问题。)

我正在使用 ZXing 的 Android 库生成二维码。 QR 码生成正确,我可以显示它(使用QRCode.getMatrix().getArray() 手动渲染后)。但是,生成的 QR 码无法使用 Android 市场上的大多数 QR 码阅读器进行扫描,包括 ZXing 的扫描仪本身!

此外,每当我为@987654321@ 设置纠错级别时,它都会忽略它并使用一些随机级别(通常是 Q 级别)进行编码。

我用这段代码生成二维码:

二维码; 尝试 { code = Encoder.encode("...QRCODEDATA...", ErrorCorrectionLevel.L); } 捕捉(WriterException ex) { log("获取二维码失败"); 返回空值; }

...然后,在获得QRCode 对象后,我像这样绘制位图:

byte[][] bitArray = qrCode.getMatrix().getArray();

        if(bitArray == null || bitArray.length < 1)
            return null;

        for(int x = 0;x < bitArray.length;x++)
        {
            for(int y = 0;y < bitArray[x].length;y++)
            {
                if(bitArray[x][y] == 0)
                    bitmapDrawCell(x,y,WHITE);
                else
                    bitmapDrawCell(x,y,BLACK);
            }
        }

Here's 我最终得到了什么。


它看起来正确,但它不会扫描。少数二维码扫描器仍会扫描它,但 大多数不会。怎么回事?

【问题讨论】:

  • 这个问题的答案:二维码其实是flipped。虽然 ZXing 文档没有解释如何索引到 qrCode.getMatrix().getArray() 返回的数组,但它假设您将它索引为 [y][x],然后在 (x,y) 处绘制该单元格)。问题中发布的代码将数组索引为 [x][y],它沿着 Y=X 线翻转图像。生成的二维码看起来是合法的,但只有“智能”扫描仪才能检测到这种翻转并对其进行扫描。 (纠错级别位也在对角。)
  • 是的,我用我的扫描仪试过了。虽然原始版本给出了不可恢复的错误,但翻转版本可以毫无错误地读取。您应该将此作为答案并接受它,这样问题就不再开放了。
  • @Henry:只要我有足够的声誉,我就会将其作为官方答案(stackoverflow 对新用户非常严格)。

标签: android qr-code zxing


【解决方案1】:

这个问题的答案:

二维码实际上是翻转的。尽管 ZXing 文档没有解释如何索引到 qrCode.getMatrix().getArray() 返回的数组,但它假设您将它索引为 [y][x],然后在 (x,y) 处绘制该单元格)。问题中发布的代码将数组索引为 [x][y],它沿着 Y=X 线翻转图像。

生成的二维码看起来是合法的,但只有“智能”扫描仪才能检测到这种翻转并对其进行扫描。

纠错级别位也在对角,因此如果您要手动验证(查看图像右下角的几个位),库似乎忽略了纠错设置。

【讨论】:

  • 是的,尽管我想您打算使用 getter 方法而不是直接访问数组,因为 getter 很清楚 x 与 y。这是 C++ 中的一个旧的保留类,表示形式是行主要的,在考虑行中的条形码时实际上很直观,但在索引到它时“翻转”。尽管该方法可能应该被弃用,但我会记录下来。
  • 感谢您的回复肖恩。我宁愿现在就记录下来。为了提高效率,我喜欢将整个事物表示为数组的想法。就我而言,这没关系,但是使用大的 QR 码也许使用数组会更快?我不是 Java 分析专家,所以我在这里可能错了。
  • JIT 会在运行时快速内联这样一个简单的 getter。即使没有它,一个方法调用也非常小,即使是在每个位置访问数千次的大型 200x200 代码也只是数百万次方法调用......谈论毫秒。
【解决方案2】:

不一定是您问题的答案,但您可以考虑使用 Google 的 QR 生成器。我用过它,它很简单。 Google QR

【讨论】:

  • 我认为这是一种选择,但问题是,谷歌的在线二维码生成器需要网络调用,而我专门编写的应用程序无法在二维码出现的确切时间使用互联网正在生成(把它想象成你登上地铁的票,那里的互联网连接会很差。)不过很好的发现!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多