QR码不与大多数QR码扫描仪扫描
我张贴这回答我的问题(口耳相传的情况下,任何人有过这个问题。)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我最终得到了什么。
它看起来不错,但它不会扫描。少数二维码扫描仪仍然会扫描它,但大多数不会。这是怎么回事?
回答这个问题:
的QR代码实际上翻转。虽然斑马线文档没有解释如何索引到阵列qrCode.getMatrix()。的getArray()返回时,它假定你将索引作为[Y] [X],然后绘制该小区在(X,Y )。发布在问题中的代码将数组索引为[x] [y],该图像沿着Y = X线翻转图像。
生成的QR码似乎合法,但只有“智能”扫描仪可以检测到这种翻转和扫描。
纠错级别位也位于对角,所以如果您要手动验证(查看图像右下角的几位),则看起来库似乎忽略了错误校正设置。
是的,尽管我想你打算使用getter方法而不是直接访问数组,因为getter清楚了x vs y。这是一个来自C++的老式继承类,其表现形式是row-major,当考虑行中的条形码时,它实际上是直观的,但是当涉及索引到条形码时会“翻转”。尽管该方法可能应该被弃用,但我会记录它。 – 2013-02-12 20:06:25
感谢您的回复肖恩。我宁愿现在就记录下来。为了效率的缘故,我喜欢将整个事物表示为一个阵列。在我的情况下,这并不重要,但是一个大的QR码可能会更快地使用数组?我不是Java分析专家,所以我可能在这里错了。 – Alex 2013-02-12 21:05:56
JIT将快速地在运行时内联这样一个简单的getter。即使没有它,方法调用也非常小,即使是在每个位置访问数千次的大型200x200代码也只有数百万次的方法调用......谈论毫秒。 – 2013-02-12 22:07:52
回答这个问题: 的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
是的,我用我的扫描仪试了一下。尽管原始文件提供了不可恢复的错误,但翻阅的版本可以无错读取。你应该作出回答并接受它,以便问题不再公开。 – Henry 2013-02-12 17:01:05
@Henry:只要我有足够的声望,我会立即作出正式答复(对于新用户,计算器的限制很大)。 – Alex 2013-02-12 17:06:36