如何查询一个二维码在生成的时候,采用了哪些参数?
包括容错率、版本、掩码类型。
谢谢!
版本似乎是6(41×41)。
对于这个二维码,信息如下:
version = 6
ecLevel = H
formatInfo.getDataMask() = 2 -> DATA_MASK_010
掩码应该是 j % 3 == 0
的那个( QR Code Mask Patterns - Reed–Solomon codes for coders - Wikiversity)
具体获取起来有些麻烦… 我一开始想从 pip 和 npm 上找相关的库,不过似乎现有的 QR Reader 库大多都是更底层工具的封装,除了结果、定位点、错误校正等级之外,能提供的其他的信息甚少。然后又尝试了 ZXing,但其暴露的公开 API 也没能提供更多信息。最后是把源码拉到本地,进到对应的方法里直接把内部数据打出来,才得到了掩码和版本信息。hook 位置位于:
com.google.zxing.qrcode.decoder.Decoder#decode(BitMatrixParser, java.util.Map<DecodeHintType,?>)
com.google.zxing.qrcode.decoder.BitMatrixParser#readCodewords
(如果需要完整代码,请论坛私信我,项目比较大不太方便直接上传论坛)
这个二维码所包含的数据是
1653324575063e323362a-e342-445b-bdf9-2e7ca0fba605
然而在使用 Zint Barcode Studio 工具生成时,即使带入了上面的参数(版本6,容错H,掩码2),生成的二维码却是这样的:
这个在线二维码生成器可以生成原贴的二维码,但是给出的参数太少,能不能通过分析网页破译它的算法呢?
我用 ZXing,似乎只需要指定 ECLEVEL 就可以生成和原始文件一致的二维码,不需要指定 MASK 和 VERSION。感觉可能和生成器的内部实现有关(毕竟 MASK, VERSION 应该是根据数据自动选取最合适的),不过我对 QR Spec 也不是很熟悉。
private static void generateQRCodeImage()
throws WriterException, IOException {
String filePath = "mine.png";
QRCodeWriter qrCodeWriter = new QRCodeWriter();
String text = "1653324575063e323362a-e342-445b-bdf9-2e7ca0fba605";
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.MARGIN, 1);
// hints.put(EncodeHintType.QR_MASK_PATTERN, 2);
// hints.put(EncodeHintType.QR_VERSION, 6);
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, 516, 516, hints);
Path path = FileSystems.getDefault().getPath(filePath);
MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
}