zoukankan      html  css  js  c++  java
  • [二维码生成和解析][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();
            }
        }
    }
    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);
        }
    }
    //实现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();
        }
    }
    DecodeDemo.java

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

  • 相关阅读:
    服务器数据库不用开通远程连接通过工具在本地连接操作的方法
    怎么搜索同类网站
    Java三行代码搞定MD5加密,测试5c短信网关的demo
    iOS检测用户截屏并获取所截图片
    tomcat输出servlet-api.jar
    从svn资源库目录checkout出maven项目方法
    Maven打包pom里面配置exclude 排除掉环境相关的配置文件
    PHP获取毫秒时间戳,利用microtime()函数
    阿里云OneinStack,Linux下tomcat命令
    阿里云OneinStack数据库相关
  • 原文地址:https://www.cnblogs.com/Zoran/p/5036748.html
Copyright © 2011-2022 走看看