您的位置:首页 > 编程语言 > Java开发

Java生成与解析二维码

2016-11-01 10:57 633 查看
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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: