Google Zxing 二维码生成与解析
程序员文章站
2022-05-28 18:52:47
...
生成二维码的开源项目可谓是琳琅满目:SwetakeQRCode、BarCode4j、Zxing等等。前端有JQuery-qrcode,同样能实现生成二维码。
选择Zxing的原因可能是觉得Google公司是很著名的公司吧。
其实使用起来相当的简单,我这里使用的是最新3.2 Zxing.jar ,省的你找jar的时间,下面是下载地址。
一.生成二维码
public static String createQrcode(){ String qrcodeFilePath = ""; try { int qrcodeWidth = 300; int qrcodeHeight = 300; String qrcodeFormat = "png"; HashMap<EncodeHintType, String> hints = new HashMap<EncodeHintType, String>(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); BitMatrix bitMatrix = new MultiFormatWriter().encode("http://bijian1013.iteye.com/", BarcodeFormat.QR_CODE, qrcodeWidth, qrcodeHeight, hints); BufferedImage image = new BufferedImage(qrcodeWidth, qrcodeHeight, BufferedImage.TYPE_INT_RGB); Random random = new Random(); File QrcodeFile = new File("D:\\qrcode\\" + random.nextInt() + "." + qrcodeFormat); ImageIO.write(image, qrcodeFormat, QrcodeFile); //MatrixToImageWriter.writeToFile(bitMatrix, qrcodeFormat, QrcodeFile); OutputStream out = new FileOutputStream(QrcodeFile); MatrixToImageWriter.writeToStream(bitMatrix, qrcodeFormat, out); qrcodeFilePath = QrcodeFile.getAbsolutePath(); } catch (Exception e) { e.printStackTrace(); } return qrcodeFilePath; }
a.上述代码中的 hints,为生成二维码时的一些参数设置,实现者将它构建Map类型的参数。
b.上述生成实现当中,每生成一个二维码都会存放在目录下面,名称取整数随机数。
c.MultiFormatWriter 对象为生成二维码的核心类,后面的 MatrixToImageWriter 只是将二维码矩阵输出到图片上面。
二.解析二维码
public static String decodeQr(String filePath) { String retStr = ""; if ("".equalsIgnoreCase(filePath) && filePath.length() == 0) { return "图片路径为空!"; } try { BufferedImage bufferedImage = ImageIO.read(new FileInputStream(filePath)); LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage); Binarizer binarizer = new HybridBinarizer(source); BinaryBitmap bitmap = new BinaryBitmap(binarizer); HashMap<DecodeHintType, Object> hintTypeObjectHashMap = new HashMap<DecodeHintType, Object>(); hintTypeObjectHashMap.put(DecodeHintType.CHARACTER_SET, "UTF-8"); Result result = new MultiFormatReader().decode(bitmap, hintTypeObjectHashMap); retStr = result.getText(); } catch (Exception e) { e.printStackTrace(); } return retStr; }
a.读取二维码图片,并送给 Zxing LuminanceSource 和 Binarizer 两兄弟的处理。
b.处理完的位图和相应的解析参数,交由 MultiFormatReader 处理,并返回解析后的结果。
c.如果对上述 两兄弟的处理 和 MultiFormatReader的解析有兴趣,可以读读源码。
三.运行效果
1.生成二维码图片
public static void main(String[] args) { ZxingDemo.createQrcode(); }
执行上面的方法,将会在D:\qrcode目录下生成一个二维码图片,如下所示:
可以直接用微信扫描,打开http://bijian1013.iteye.com/网址,当然,也可以用decodeQr方法解析此二维码。
2.解析二维码
public static void main(String[] args) { //ZxingDemo.createQrcode(); String retStr = ZxingDemo.decodeQr("D:\\qrcode\\-2018013175.png"); System.out.println(retStr); }
执行上面的方法,输出字符串“http://bijian1013.iteye.com/”。