介绍三种二维码的生成方式:
第一种:使用google的zxing生成
- package com.zxing;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.IOException;
- import java.nio.file.FileSystems;
- import java.nio.file.Path;
- import java.util.HashMap;
- import java.util.Map;
- import javax.imageio.ImageIO;
- import com.google.zxing.BarcodeFormat;
- import com.google.zxing.Binarizer;
- import com.google.zxing.BinaryBitmap;
- import com.google.zxing.DecodeHintType;
- import com.google.zxing.EncodeHintType;
- import com.google.zxing.LuminanceSource;
- import com.google.zxing.MultiFormatReader;
- import com.google.zxing.MultiFormatWriter;
- import com.google.zxing.NotFoundException;
- import com.google.zxing.Result;
- import com.google.zxing.WriterException;
- import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
- import com.google.zxing.client.j2se.MatrixToImageWriter;
- import com.google.zxing.common.BitMatrix;
- import com.google.zxing.common.HybridBinarizer;
- public class TestZXing {
- public static void main(String[] args) throws Exception {
- // testEncode();
- testDecode();
- }
- /**
- * 生成二维码
- *
- * @throws WriterException
- * @throws IOException
- */
- public static void testEncode() throws WriterException, IOException {
- String filePath = "D://";
- String fileName = "zxing.png";
- String content = "测试zxing生成二维码";
- int width = 300; // 图像宽度
- int height = 300; // 图像高度
- String format = "png";// 图像类型
- Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
- hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
- BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
- BarcodeFormat.QR_CODE, width, height, hints);// 生成矩阵
- Path path = FileSystems.getDefault().getPath(filePath, fileName);
- MatrixToImageWriter.writeToPath(bitMatrix, format, path);// 输出图像
- System.out.println("输出成功.");
- }
- /**
- * 解析二维码
- */
- public static void testDecode() {
- String filePath = "D://zxing.png";
- BufferedImage image;
- try {
- image = ImageIO.read(new File(filePath));
- LuminanceSource source = new BufferedImageLuminanceSource(image);
- Binarizer binarizer = new HybridBinarizer(source);
- BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
- Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();
- hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
- Result result = new MultiFormatReader().decode(binaryBitmap, hints);// 对图像进行解码
- System.out.println("图片中内容: ");
- System.out.println("author: " + result.getText());
- System.out.println("图片中格式: ");
- System.out.println("encode: " + result.getBarcodeFormat());
- } catch (IOException e) {
- e.printStackTrace();
- } catch (NotFoundException e) {
- e.printStackTrace();
- }
- }
- }
第二种方式:使用qrCode方式
- package com.qrCode;
- import java.awt.Color;
- import java.awt.Graphics2D;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.IOException;
- import javax.imageio.ImageIO;
- import com.swetake.util.Qrcode;
- import jp.sourceforge.qrcode.QRCodeDecoder;
- import jp.sourceforge.qrcode.exception.DecodingFailedException;
- public class QRCode {
- /**
- * 解析二维码(QRCode)
- *
- * @param imgPath
- * @return
- */
- public static String decoderQRCode(String imgPath) {
- // QRCode 二维码图片的文件
- File imageFile = new File(imgPath);
- BufferedImage bufImg = null;
- String content = null;
- try {
- bufImg = ImageIO.read(imageFile);
- QRCodeDecoder decoder = new QRCodeDecoder();
- content = new String(decoder.decode(new QRCodeImageBean(bufImg)), "utf-8");
- } catch (IOException e) {
- System.out.println("Error: " + e.getMessage());
- e.printStackTrace();
- } catch (DecodingFailedException dfe) {
- System.out.println("Error: " + dfe.getMessage());
- dfe.printStackTrace();
- }
- return content;
- }
- /**
- * 生成二维码(QRCode)图片
- *
- * @param content 存储内容
- * @param imgPath 图片路径
- * @param imgType 图片类型
- */
- public static void encoderQRCode(String content, String imgPath, String imgType) {
- encoderQRCode(content, imgPath, imgType, 7);
- }
- /**
- * 生成二维码(QRCode)图片
- *
- * @param content 存储内容
- * @param imgPath 图片路径
- * @param imgType 图片类型
- * @param size 二维码尺寸
- */
- public static void encoderQRCode(String content, String imgPath, String imgType, int size) {
- try {
- BufferedImage bufImg = qRCodeCommon(content, imgType, size);
- File imgFile = new File(imgPath);
- // 生成二维码QRCode图片
- ImageIO.write(bufImg, imgType, imgFile);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 生成二维码(QRCode)图片的公共方法
- *
- * @param content 存储内容
- * @param imgType 图片类型
- * @param size 二维码尺寸(1-40)
- * @return
- */
- private static BufferedImage qRCodeCommon(String content, String imgType, int size) {
- BufferedImage bufImg = null;
- try {
- Qrcode qrcodeHandler = new Qrcode();
- // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
- qrcodeHandler.setQrcodeErrorCorrect('M');
- qrcodeHandler.setQrcodeEncodeMode('B');
- // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
- qrcodeHandler.setQrcodeVersion(size);
- // 获得内容的字节数组,设置编码格式
- byte[] contentBytes = content.getBytes("utf-8");
- // 图片尺寸
- int imgSize = 67 + 12 * (size - 1);
- bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
- Graphics2D gs = bufImg.createGraphics();
- // 设置背景颜色
- gs.setBackground(Color.WHITE);
- gs.clearRect(0, 0, imgSize, imgSize);
- // 设定图像颜色> BLACK
- gs.setColor(Color.BLACK);
- // 设置偏移量,不设置可能导致解析出错
- int pixoff = 2;
- // 输出内容> 二维码
- if (contentBytes.length > 0 && contentBytes.length < 800) {
- boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
- for (int i = 0; i < codeOut.length; i++) {
- for (int j = 0; j < codeOut.length; j++) {
- if (codeOut[j][i]) {
- gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
- }
- }
- }
- } else {
- throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");
- }
- gs.dispose();
- bufImg.flush();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return bufImg;
- }
- }
- package com.qrCode;
- import java.awt.image.BufferedImage;
- import jp.sourceforge.qrcode.data.QRCodeImage;
- public class QRCodeImageBean implements QRCodeImage {
- BufferedImage bufImg;
- public QRCodeImageBean(BufferedImage bufImg) {
- this.bufImg = bufImg;
- }
- public int getHeight() {
- return bufImg.getHeight();
- }
- public int getPixel(int x, int y) {
- return bufImg.getRGB(x, y);
- }
- public int getWidth() {
- return bufImg.getWidth();
- }
- }
- package com.qrCode;
- public class TestQRCode {
- public static void main(String[] args) {
- //生成二维码
- String imgPath = "d:/qrCode.png";
- String encoderContent = "http://www.qrCode.com";
- QRCode.encoderQRCode(encoderContent, imgPath, "png");
- System.out.println("encoder success!!!");
- //解析二维码
- String imgPath2 = "d:/qrCode.png";
- String qrCon = QRCode.decoderQRCode(imgPath2);
- System.out.println("decoder success!!!");
- System.out.println("二维码内容为:" + qrCon);
- }
- }
第三种方式:这也是最简单的方式使用jQuery的qrCode插件
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>使用JQueryQrCode生成二维码</title>
- <script type="text/javascript" src="./js/jquery-1.9.1.min.js"></script>
- <script type="text/javascript" src="./js/qrcode.js"></script>
- </head>
- <body>
- <div id="qrcode"></div>
- <script type="text/javascript">
- //参数1表示图像大小,取值范围1-10;参数2表示质量,取值范围'L','M','Q','H'
- var content = "使用JQueryQrCode生成二维码"
- var qr = qrcode(8, 'M');
- qr.addData(content);
- qr.make();
- /* var dom=document.createElement('DIV');
- dom.innerHTML = qr.createImgTag();
- var element=document.getElementById("qrcode");
- element.appendChild(dom); */
- $("#qrcode").html(qr.createImgTag());
- </script>
- </body>
- </html>