Java生成与解析二维码

1、下载支持二维码的jar包qrcode.jar和qrcode_swetake.jar,

其中qrcode_swetake.jar用于生成二维码,rcode.jar用于解析二维码,jar包下载地址(免积分):http://download.csdn.net/detail/bakehe/9548373

2、创建J2SEImageGucas实现类,用于实现二维码图像接口QRCodeImage

 1 package org.sasc.core.twobarcode;
 2 
 3 import java.awt.image.BufferedImage;
 4 
 5 import jp.sourceforge.qrcode.data.QRCodeImage;
 6 
 7 public class J2SEImageGucas implements QRCodeImage {
 8     BufferedImage image;
 9 
10     public J2SEImageGucas(BufferedImage image) {
11         this.image = image;
12     }
13 
14     public int getWidth() {
15         return image.getWidth();
16     }
17 
18     public int getHeight() {
19         return image.getHeight();
20     }
21 
22     public int getPixel(int x, int y) {
23         return image.getRGB(x, y);
24     }
25 }

3、编写生成二维码的方法encode和解析二维码的方法decode

  1 package org.sasc.core.twobarcode;
  2 
  3 import java.awt.Color;
  4 import java.awt.Graphics2D;
  5 import java.awt.image.BufferedImage;
  6 import java.io.File;
  7 import java.io.IOException;
  8 
  9 import javax.imageio.ImageIO;
 10 
 11 import org.apache.log4j.Logger;
 12 
 13 import com.swetake.util.Qrcode;
 14 
 15 import jp.sourceforge.qrcode.QRCodeDecoder;
 16 
 17 public class CreateQRCode {
 18     private static final Logger log = Logger.getLogger(CreateQRCode.class);
 19 
 20     /**
 21      * 生成二维码
 22      * 
 23      * @param srcValue 二维码内容
 24      * @param qrcodePicfilePath 生成路径及二维码图片名称
 25      * @return
 26      * @author muxiaoyou
 27      */
 28     private static boolean encode(String srcValue, String qrcodePicfilePath) {
 29         int MAX_DATA_LENGTH = 200;
 30         byte[] d = srcValue.getBytes();
 31         int dataLength = d.length;
 32         int imageWidth = 139;//宽度为139像素
 33         int imageHeight = imageWidth;//长度也为139像素,即此二维码为139*139像素
 34         BufferedImage bi = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
 35 
 36         Graphics2D g = bi.createGraphics();
 37         g.setBackground(Color.WHITE);
 38         g.clearRect(0, 0, imageWidth, imageHeight);
 39         g.setColor(Color.BLACK);
 40 
 41         if (dataLength > 0 && dataLength <= MAX_DATA_LENGTH) {
 42             //QR码的最大容量取决于选择的版本、纠错级别和编码模式(Mode:数字、字符、多字节字符等)
 43             Qrcode qrcode = new Qrcode();
 44             qrcode.setQrcodeErrorCorrect('M');//设置容错率为M
 45             qrcode.setQrcodeEncodeMode('B');//设置二维码加密模式为B
 46             qrcode.setQrcodeVersion(7);//设置二维码模式为7,取值范围为1到40,值越大所能包含的字符信息量越大
 47             boolean[][] b = qrcode.calQrcode(d);
 48             int qrcodeDataLen = b.length;
 49             for (int i = 0; i < qrcodeDataLen; i++) {
 50                 for (int j = 0; j < qrcodeDataLen; j++) {
 51                     if (b[j][i]) {
 52                         g.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);
 53                     }
 54                 }
 55             }
 56             log.info("二维码生成完成!!");
 57         } else {
 58             log.info(dataLength + "大于" + MAX_DATA_LENGTH);
 59             return false;
 60         }
 61         g.dispose();
 62         bi.flush();
 63         
 64         File f = new File(qrcodePicfilePath);
 65         if(!f.exists()){
 66             f.mkdirs();
 67         }
 68         String suffix = f.getName().substring(f.getName().indexOf(".") + 1, f.getName().length());
 69         try {
 70             ImageIO.write(bi, suffix, f);
 71             log.info("二维码输出成功!!");
 72         } catch (IOException ioe) {
 73             log.info("二维码生成失败" + ioe.getMessage());
 74             return false;
 75         }
 76         return true;
 77     }
 78     
 79     /**
 80      * 解析二维码
 81      * @param qrcodePicfilePath 二维码图片路径
 82      * @return
 83      * @author muxiaoyou
 84      */
 85     private static String decode(String qrcodePicfilePath) {
 86         log.info("开始解析二维码!!");
 87         /* 读取二维码图像数据 */
 88         File imageFile = new File(qrcodePicfilePath);
 89         BufferedImage image = null;
 90         try {
 91             image = ImageIO.read(imageFile);
 92         } catch (IOException e) {
 93             log.info("读取二维码图片失败: " + e.getMessage());
 94             return null;
 95         }
 96         /* 解析二维码 */
 97         QRCodeDecoder decoder = new QRCodeDecoder();
 98         String decodedData = new String(decoder.decode(new J2SEImageGucas(image)));
 99         log.info("解析内容如下:" + decodedData);
100         return decodedData;
101     }
102     
103     /**
104      * 程序入口
105      */
106     public static void main(String[] args) {
107         String data = "文档编号:Document-967-9301;文档名称:普通文档";
108         /**
109          * 生成二维码
110          */
111         CreateQRCode.encode(data, "D:/twoBarCodeImagessss/文档Document.JPG");
112         /**
113          * 解析二维码
114          */
115         CreateQRCode.decode("D:/twoBarCodeImagessss/文档Document.JPG");
116     }
117 
118 }
原文地址:https://www.cnblogs.com/cnjavahome/p/6018583.html