2013-02-12 193 views
3

我张贴这回答我的问题(口耳相传的情况下,任何人有过这个问题。)QR码不与大多数QR码扫描仪扫描

我生成一个使用ZXing的Android库的QR码。 QR码生成正确的,我能够显示它(手工绘制出来使用QRCode.getMatrix().getArray()后)。但是,生成的QR代码不与大多数Android市场上可用的QR代码阅读器扫描,包括斑马线的扫描仪本身!

此外,每当我设置纠错等级为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我最终得到了什么。


它看起来不错,但它不会扫描。少数二维码扫描仪仍然会扫描它,但大多数不会。这是怎么回事?

+3

回答这个问题: 的QR码实际上[翻转](http://i.imgur.com/y5eJPoZ.jpg)。虽然斑马线文档没有解释如何索引到阵列qrCode.getMatrix()。的getArray()返回时,它假定你将索引作为[Y] [X],然后绘制该小区在(X,Y )。发布在问题中的代码将数组索引为[x] [y],该图像沿着Y = X线翻转图像。由此产生的二维码似乎是合法的,但只有'聪明'的扫描仪才能检测到这种翻转并对其进行扫描。 (纠错等级位也在对面。) – Alex 2013-02-12 16:48:01

+0

是的,我用我的扫描仪试了一下。尽管原始文件提供了不可恢复的错误,但翻阅的版本可以无错读取。你应该作出回答并接受它,以便问题不再公开。 – Henry 2013-02-12 17:01:05

+0

@Henry:只要我有足够的声望,我会立即作出正式答复(对于新用户,计算器的限制很大)。 – Alex 2013-02-12 17:06:36

回答

3

回答这个问题:

的QR代码实际上翻转。虽然斑马线文档没有解释如何索引到阵列qrCode.getMatrix()。的getArray()返回时,它假定你将索引作为[Y] [X],然后绘制该小区在(X,Y )。发布在问题中的代码将数组索引为[x] [y],该图像沿着Y = X线翻转图像。

生成的QR码似乎合法,但只有“智能”扫描仪可以检测到这种翻转和扫描。

纠错级别位也位于对角,所以如果您要手动验证(查看图像右下角的几位),则看起来库似乎忽略了错误校正设置。

flipped QR code

+1

是的,尽管我想你打算使用getter方法而不是直接访问数组,因为getter清楚了x vs y。这是一个来自C++的老式继承类,其表现形式是row-major,当考虑行中的条形码时,它实际上是直观的,但是当涉及索引到条形码时会“翻转”。尽管该方法可能应该被弃用,但我会记录它。 – 2013-02-12 20:06:25

+0

感谢您的回复肖恩。我宁愿现在就记录下来。为了效率的缘故,我喜欢将整个事物表示为一个阵列。在我的情况下,这并不重要,但是一个大的QR码可能会更快地使用数组?我不是Java分析专家,所以我可能在这里错了。 – Alex 2013-02-12 21:05:56

+0

JIT将快速地在运行时内联这样一个简单的getter。即使没有它,方法调用也非常小,即使是在每个位置访问数千次的大型200x200代码也只有数百万次的方法调用......谈论毫秒。 – 2013-02-12 22:07:52

2

不一定要回答你的问题,但你可以考虑谷歌的QR发生器。我用它,它很简单。 Google QR

+0

我认为这是一个选项,但问题是,Google的在线QR码生成器需要网络电话,而且我正在编写的应用程序无法在生成QR码的确切时间使用互联网(将此视为作为您登上地铁的票,在那里互联网连接将会很差。) 虽然好找! – Alex 2013-02-12 16:45:08