首页 > 学院 > 开发设计 > 正文

[二维码生成和解析][Java]

2019-11-14 14:50:49
字体:
来源:转载
供稿:网友

首先必须的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();        }    }}
QrcodeDemo.java

解析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);    }}//实现QRCodeImageclass 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();    }}
DecodeDemo.java

当然大家也可以提取成工具类 (工具类:方便工作时随意复制粘贴)


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表