Android zxing库生成的QR码不会扫描大多数QR码扫描仪

我发布这个来回答我自己的问题(传播这个词以防其他人有这个问题.)

我正在使用ZXing的Android库生成QR码. QR码生成正常,我能够显示它(使用QRCode.getMatrix().getArray()手动渲染后.)但是,生成的QR码不能扫描Android上的大多数QR码阅读器市场,包括ZXing的扫描仪本身!

此外,每当我将错误修正级别设置为Encoder时,它会忽略它并编码一些随机级别(通常是级别Q).

我用这段代码生成QR码:


    QRCode code;

    try
    {
            code = Encoder.encode("...QRCODEDATA...", ErrorCorrectionLevel.L);
    }
    catch(WriterException ex)
    {
            log("Failed to obtain a QR code");
            return null;
    }
    

…然后,在获得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我最终得到了什么.

它看起来正确,但它不会扫描.少数QR码扫描仪仍会扫描它,但是
大多数人不会.这是怎么回事?

解决方法:

这个问题的答案:

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

由此产生的QR码似乎是合法的,但只有“智能”扫描仪才能检测到这种翻转并进行扫描.

纠错级别位也位于相反的角落,因此如果您要手动验证(查看图像右下角的几位),则表明库似乎忽略了纠错设置.

上一篇:android – 检查ZXing支持的最简单方法?


下一篇:在WPF中开启摄像头扫描二维码(Media+Zxing)