我发布这个来回答我自己的问题(传播这个词以防其他人有这个问题.)
我正在使用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码似乎是合法的,但只有“智能”扫描仪才能检测到这种翻转并进行扫描.
纠错级别位也位于相反的角落,因此如果您要手动验证(查看图像右下角的几位),则表明库似乎忽略了纠错设置.