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 }