二维码生成与解析代码实现

二维码生成与解析代码实现二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字、图片、 网址等信息的条码图片如下图二维码的特点:1. 高密度编码,信息容量大可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普 通条码信息容量约高几十倍2. 编码范围广该条码可以把图片、声音、文字、签字、指纹等可以数字化的信息进行编码,用条码表 示出来;可以表示多种语言文字;可表示图像数据3. 容错能力强,具有纠错功能这使得二维条码因穿孔、污损等引起局部损坏时,照样可以正确得到识读,损毁面积达 50%仍可恢复信息4. 译码可靠性高它比普通条码译码错误率百万分之二要低得多,误码率不超过千万分之一5. 可引入加密措施保密性、防伪性好6. 成本低,易制作,持久耐用正因为以上这些特点,二维码现在越来越流行,应用也是越来越广(详细了解请见百度 百科,介绍不是本篇重点),所以掌握如何开发二维码是非常不错的知识储备,因此本篇博 文将为大家讲解如何生成、解析二维码一、Java所需 jar 包:QRCode.jarhttp://dow nl oad.csd n.n et/detail/wa ngpe ng047/4008532TwoDime nsio nCode类:二维码操作核心类package qrcode;[java] view plaincopy1.2.3.4.5.6.import java.awt.Color;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.imageio.ImagelO;import jp.sourceforge.qrcode.QRCodeDecoder;import jp.sourceforge.qrcode.exception.DecodingFailedException;import com.swetake.util.Qrcode;public class TwoDimensionCode {*生成二维码(QRCode)图片* @param con tent 存储内容* @param imgPath 图片路径*/public void encoderQRCode(String content, String imgPath) { this.encoderQRCode(content, imgPath, "png", 7);}*生成二维码(QRCode)图片* @param con tent 存储内容* @param output 输出流*/public void encoderQRCode(String content, OutputStream output) { this.encoderQRCode(content, output, "png", 7);}*生成二维码(QRCode)图片* @param con tent 存储内容* @param imgPath 图片路径* @param imgType 图片类型*/public void encoderQRCode(String content, String imgPath, String imgType ){this.encoderQRCode(content, imgPath, imgType, 7);}/**7.&9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.*生成二维码(QRCode)图片* @param con tent 存储内容* @param output 输出流* @param imgType 图片类型*/public void encoderQRCode(String content, OutputStream output, String im gType) {this.encoderQRCode(content, output, imgType, 7);}gType,/***生成二维码(QRCode)图片@param@param@param@paramcon ten t存储内容 imgPath图片路径 imgType图片类型 size二维码尺寸*/public void encoderQRCode(String content, String imgPath, String imgType size) {try {Bufferedlmage bufImg = this.qRCodeCommon(content, imgType, size)File imgFile = new File(imgPath);//生成二维码QRCode图片ImagelO.write(bufImg, imgType, imgFile);} catch (Exception e) {e.printStackTrace();}}/***生成二维码(QRCode)图片@param@param@param@paramcon ten t存储内容 out put输出流 imgType图片类型 size二维码尺寸*/public void encoderQRCode(String content, OutputStream output, String im int size) {try {Bufferedlmage bufImg = this.qRCodeCommon(content, imgType, size)//生成二维码QRCode图片ImagelO.write(bufImg, imgType, output);50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.} catch (Exception e) { e.printStackTrace();}}94.95.96.97.98.99.100.101./***生成二维码(QRCode)图片的公共方法* @param con tent 存储内容* @param imgType 图片类型* @param size二维码尺寸* @return*/private Bufferedlmage qRCodeCommon(String content, String imgType, int size) {102.103.104.105.Bufferedlmage bufImg = null;try {Qrcode qrcodeHandler = new Qrcode();//设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小106.107.108.109.110.111.112.113.114.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, Bufferedlmage.TYPE,INT_RGB);115.116.117.118.Graphics2D gs = bufImg.createGraphics();//设置背景颜色gs.setBackground(Color.WHITE);gs.clearRect(0, 0, imgSize, imgSize);119.120.121.122.123.124.125.126.//设定图像颜色〉BLACKgs.setColor(Color.BLACK);//设置偏移量,不设置可能导致解析出错int pixoff = 2;//输出内容〉二维码if (contentBytes.length > 0 && contentBytes.length < 800) {boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);127.128.for (int i = 0; i < codeOut.length; i++) {for (int j = 0; j < codeOut.length; j++) {129.130.);131.132.133.134.135.ntBytes.length + " not in [0, 800].");136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154.155.156.157.158.if (codeOut[j][i]) {gs.fillRectj * 3 + pixoff, i * 3 + pixoff, 3, 3}}} else {throw new Exception("QRCode content bytes length = " + conte}gs.dispose(); bufImg.flush();} catch (Exception e) {e.printStackTrace();}return bufImg;}/***解析二维码(QRCode)* @param imgPath 图片路径* @return*/public String decoderQRCode(String imgPath) {// QRCode二维码图片的文件File imageFile = new File(imgPath);Bufferedlmage bufImg = null;String content = null;try {bufImg = ImagelO.read(imageFile);QRCodeDecoder decoder = new QRCodeDecoder();content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");159.160. 161. 162.163.164.165.166.167.168. 169.} catch (IOException e) {System.out.println("Error: " + e.getMessage()); e.printStackTrace();} catch (DecodingFailedException dfe) {System.out.println("Error: " + dfe.getMessage()); dfe.printStackTrace();}return content;/**}170.171.172.173.174.175.176.177.178.179.180.fImg)),181.182.183.184.185.186.187.188.189.190.191.192.193.*解析二维码(QRCode)* @param input 输入流* @return*/public String decoderQRCode(InputStream input) {Bufferedlmage bufImg = null;String content = null;try {bufImg = ImageIO.read(input);QRCodeDecoder decoder = new QRCodeDecoder();content = new String(decoder.decode(new TwoDimensionCodeImage(buutf-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;}public static void main(String[] args) {String imgPath = "G:/TDDOWNLOAD/Michael_QRCode.png";String encoderContent = "Hello 大大、小小‘welcome to QRCode!" + "\nMyblog [ ]" + "\nEMail [ sjsky007@ ]";194.195.196.//197.//198.//199.//200.//201.//202.203.204.205.206.207.208.209.}210.}TwoDimensionCode handler = new TwoDimensionCode(); handler.encoderQRCode(encoderContent, imgPath, "png"); try {OutputStream output = new FileOutputStream(imgPath); handler.encoderQRCode(content, output);} catch (Exception e) {e.printStackTrace();}System.out.println("========encoder success");String decoderContent = handler.decoderQRCode(imgPath);System.out.println("解析结果如下:");System.out.println(decoderContent);System.out.println("========decoder success!!!");TwoDime nsio nCodelmage 类:二维码图片对象[java] view plaincopypackage qrcode;import java.awt.image.Bufferedlmage;import jp.sourceforge.qrcode.data.QRCodelmage;public class TwoDimensionCodelmage implements QRCodelmage {Bufferedlmage bufImg;public TwoDimensionCodeImage(BufferedImage bufImg) { this.bufImg = bufImg;} @0verridepublic int getHeight() {return bufImg.getHeight();} @Overridepublic int getPixel(int x, int y) {return bufImg.getRGB(x, y);} @Overridepublic int getWidth() {1.2.3.4.5.6.7.&9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.return bufImg.getWidth();。