[二维码生成和解析][Java]
首先必须的jar包文件:百度云盘下载
Qrcode.jar Qrcode_Swetake.jar 这两个就是我们的主角
学习之前可以简单了解一下:二维码原理
新建JavaProject 新建lib文件夹
将jar文件复制进去,选中jar文件右键BuildPath -- Add to BuildPath (旁白:这么简单的操作你都还要讲!)
进入正题:
代码如下: 为方面同学理解 注释较多 请理解 如感不适 请见谅
(旁白:废话太多了 我要看代码!)
生成Qrcode代码:
新建 QrcodeDemo.java
package qrcode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import javax.imageio.ImageIO; import com.swetake.util.Qrcode; public class QrcodeDemo { public static void main(String[] args) throws UnsupportedEncodingException { Qrcode qrcode=new Qrcode(); //二维码包含:数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误) //格式信息:表示改二维码的纠错级别,分为L、M、Q、H //错误修正容量 //L水平 7%的字码可被修正 //M水平 15%的字码可被修正 //Q水平 25%的字码可被修正 //H水平 30%的字码可被修正 //Qrcode有容错能力,Qrcode图形如果有破损,仍然可以被读取内容,最高可以到30%面积破损仍可被读取。 //相对而言,容错率愈高,Qrcode图形面积愈大。 //所以一般折衷使用15%容错能力 - 'M' qrcode.setQrcodeErrorCorrect('M'); //B 以2进制形式 进行信息存储 qrcode.setQrcodeEncodeMode('B'); //设置Qrcode版本 //QR码符号共有40种规格的矩阵(一般为黑白色) //从21x21(版本1),到177x177(版本40) //每一版本符号比前一版本 每边增加4个模块 //常用版本为7 如支付宝版本 qrcode.setQrcodeVersion(7); //创建图片的存储空间 - 流空间 BufferedImage img=new BufferedImage(140,140,BufferedImage.TYPE_INT_RGB);//常量 8位 颜色的图片 //画笔工具 Graphics2D g=img.createGraphics(); g.setBackground(Color.white); g.clearRect(0, 0, 140, 140); g.setColor(Color.black); File file=new File("/Users/Summer/Desktop/二维码.png"); //数据信息 String str="http://www.baidu.com"; byte[] data =str.getBytes(); //生成的cal boolean[][] qrcodeDate=qrcode.calQrcode(data); // 设置偏移量 不设置可能导致解析出错 int offset=2; for (int i = 0; i < qrcodeDate.length; i++) { for (int j = 0; j < qrcodeDate.length; j++) { /* 必须做判定 判定为true的部分进行打印*/ if(qrcodeDate[j][i]){//注意j i的位置 否则可能导致后续无法解析 //主意j i的位置 防止绘制错误 g.fillRect(j*3+offset,i*3+offset,3,3); /* * 以下尺寸合适,二维码居中 * 100*100 (j*2+5,i*2+5,3,3) * 140*140 (j*3+2,i*3+2,3,3) * 300*300 (j*6+15,i*6+15,6,6); */ } } } //刷新 img.flush(); //释放资源 g.dispose(); try { //流写入文件 ImageIO.write(img,"png",file); } catch (IOException e) { e.printStackTrace(); } } }
解析Qrcode:
新建 DecodeDemo.java
package qrcode; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import jp.sourceforge.qrcode.QRCodeDecoder; import jp.sourceforge.qrcode.data.QRCodeImage; public class DecodeDemo { public static void main(String[] args) { BufferedImage img = null; try { //读取到流中.. img = ImageIO.read(new File("/Users/Summer/Desktop/2维码.png")); } catch (IOException e) { e.printStackTrace(); } //QRCodeDecoder对象 进行解析操作 QRCodeDecoder qrcodeDecoder = new QRCodeDecoder(); //读取数据 byte[] //注意该方法参数 需要QRCodeImage对象 自己写对象实现和重写 byte[] decodeByte = qrcodeDecoder.decode(new qrcodeImg(img)); String s = new String(decodeByte); System.out.println(s); } } //实现QRCodeImage class qrcodeImg implements QRCodeImage { public BufferedImage img; public qrcodeImg(BufferedImage img) { this.img = img; } @Override public int getHeight() { return img.getHeight(); } @Override public int getPixel(int x, int y) { return img.getRGB(x, y); } @Override public int getWidth() { return img.getWidth(); } }
当然大家也可以提取成工具类 (工具类:方便工作时随意复制粘贴)