你不可错过的二维码生成与解析-java后台与前端js都有

50 篇文章 0 订阅
4 篇文章 0 订阅

来源:https://blog.csdn.net/lx520aa/article/details/77483563

1.二维码分类

  二维条码也有许多不同的码制,就码制的编码原理而言,通常分为三种类型。

  1. 线性堆叠式二维码

编码原理:
建立在一维条码基础之上,按需要堆积成两行或多行。

图示:
image

  1. 矩阵式二维码

最常用编码,原理:
在一个矩形空间通过黑白像素在矩阵中的不同分布进行编码。在矩阵相应的位置上,用点(方点、圆点或其它形状)的出现表示二进制“1”,点的不出现表示二进制的“0”

图示:
image

  1. 邮政码

    通过不同长度的条进行编码,主要用于邮政编码。

2.QR Code

  现在最常用的就是这种,咱们现在主要介绍的也是这种。为啥这种使用二维码那么受反应呢?主要QR Code这种二维码有如下优点:

  1. 识读速度快
  2. 数据密度大
  3. 占用空间小

2.1 QR Code介绍

image

2.2 QR Code 结构

image

大家可以了解下二维码的结构,知道大概就行了,如果想了解详细信息的话可以自行百度,国家有详细的二维码规范。

3.后台JAVA代码实现二维码(QR Code)生成

  这里介绍如下两种实现方式:

  1. Java 后台实现,主要使用zxing和qrcodejar等第三方jar包。
  2. 前端javascript实现,主要使用jquery.qrcode.js
    jquery.qrcode.js的下载地址可以百度"qrcode.js"字符串或是直接从http://www.jq22.com/jquery-info294下载,当然要先注册一个账号才可以,注册后就可以下载。
  3. 示例代码如下:
    <!DOCTYPE html>
    <html>
    <head>
    <title>Demo page</title>
    </head>
    <body>
    <div id="output"></div>
    <script src="jquery-1.10.2.min.js"></script>
    <script type="text/javascript" src="jquery.qrcode.min.js"></script>
    <script>
    jQuery(function(){
    jQuery('#output').qrcode("http://www.jq22.com");
    })
    </script>
    </body>
    </html>

就这么简单,您想要的二维码就生成了。

进阶用法

指定二维码的生成方式:

可以在调用函数的同时输入想要的二维码生成方式(table/canvas)。

1
2
3
4
5
6
7
8
9
10
11
//使用table生成
jQuery( '#qrcode' ).qrcode({
     render:  "table" ,
     text:  "http://www.jq22.com"
});
 
//使用canvas生成
jQuery( '#qrcode' ).qrcode({
     render:  "canvas" ,
     text:  "http://www.jq22.com"
});

指定生成二维码的大小:

可以在调用函数的同时输入想要生成二维码的宽度和高度即可指定生成的二维码的大小。

1
2
3
4
5
6
7
//生成100*100(宽度100,高度100)的二维码
jQuery( '#qrcode' ).qrcode({
     render:  "canvas" //也可以替换为table
     width: 100,
     height: 100,
     text:  "http://www.jq22.com"
});

指定生成二维码的色彩样式:

可以在调用函数的同时输入想要生成二维码的前景色和背景色即可指定生成的二维码的色彩样式。

1
2
3
4
5
6
7
//生成前景色为红色背景色为白色的二维码
jQuery( '#qrcode' ).qrcode({
     render:  "canvas" //也可以替换为table
     foreground:  "#C00" ,
     background:  "#FFF" ,
     text:  "http://www.jq22.com"
});

中文ULR生成方法:

1
jQuery( "#output" ).qrcode(encodeURI( "http://中文中文" ));//使用encodeURI进行转码

3.1 使用zxing生成二维码

3.1.1 zxing相关网站

zxing的GitHub:https://github.com/zxing/zxing

通过git clone git@github.com:zxing/zxing.git 命令我们可以把整个ZXing项目拉取下来。

zxing的Java文档
3.1.2 生成zxing jar包

由于github上没有相关的jar包,所以需要我们自己生成一下,上面有好多关于android相关的,我们只需要选取核心包和javase这两部分代码。既下图矩形框内容:
image
生成方式我大致说下:首先在ecplise里新建一个java项目zxing,将刚才画框代码拷贝进去,然后通过export导出一个jar包即可。如果你不想生成也可以在网上找找

3.1.3 生成二维码代码

package cn.rivamed.zxing;

import java.io.File;
import java.nio.file.Path;
import java.util.HashMap;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

public class CreateQRCode {
    public static void main(String[] args) {
        
        int width=300;
        int height=300;
        
        String format="png";
        //这里如果你想自动跳转的话,需要加上https://
        String content="https://github.com/hbbliyong/QRCode.git";
        
        HashMap hits=new HashMap();
        hits.put(EncodeHintType.CHARACTER_SET, "utf-8");//编码
        //纠错等级,纠错等级越高存储信息越少
        hits.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        //边距
        hits.put(EncodeHintType.MARGIN, 2);
        
        try {
            BitMatrix bitMatrix=new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height,hits);
            //如果做网页版输出可以用输出到流
            //MatrixToImageWriter.writeToStream(matrix, format, stream);
            Path path=new File("D:/zxingQRCode.png").toPath();
            MatrixToImageWriter.writeToPath(bitMatrix, format, path);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("that is all");
    }
}

生成的结果如下:
image

由于代码都有详细注释,我就不一一讲解了,有疑问可以留言,我们一块探讨。

3.1.4 解析二维码代码

package cn.rivamed.zxing;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import javax.imageio.ImageIO;

import com.google.zxing.Binarizer;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitArray;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

public class ReadQRCode {

    public static void main(String[] args) {
        try {
            MultiFormatReader formatReader=new MultiFormatReader();
            File file=new File("D:/zxingQRCode.png");
            BufferedImage image=ImageIO.read(file);
            BinaryBitmap binaryBitmap=new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
            
            HashMap hints=new HashMap();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//编码
            
            Result result=formatReader.decode(binaryBitmap, hints);
            System.out.println("解析结果:"+result.toString());
            System.out.println("二维码格式类型:"+result.getBarcodeFormat());
            System.out.println("二维码文本"+result.getText());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

3.2 使用qrcode生成解析二维码

3.2.1 生成二维码
package cn.rivamed.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 CreateQRCode {

    public static void main(String[] args) throws IOException {

        Qrcode x=new Qrcode();
        int version=7;
        x.setQrcodeErrorCorrect('M');//纠错等级
        x.setQrcodeEncodeMode('B');//N代表数字,A代表a-Z,B代表其它(中文等)
        
        x.setQrcodeVersion(version);//版本号
        String qrData="https://github.com/hbbliyong/QRCode.git";
        //int width=300;
        int width=67+12*(version-1);
        //int height=300;
        int height=67+12*(version-1);
        BufferedImage bufferedImage=new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
        
        Graphics2D gs=bufferedImage.createGraphics();
        gs.setBackground(Color.WHITE);
        gs.setColor(Color.BLACK);
        gs.clearRect(0, 0, width, height);
        
        int pixoff=2;//偏移量,如果不加有可能会导致识别不准确
        //如果有汉字需要加上编码
        byte[] d=qrData.getBytes("gb2312");
        //byte[] d=qrData.getBytes();
        if(d.length>0&&d.length<120){
            boolean[][] s=x.calQrcode(d);
            
            for(int i=0;i<s.length;i++){
                for(int j=0;j<s.length;j++){
                    if(s[j][i]){
                        gs.fillRect(j*3+pixoff, i*3+pixoff, 3, 3);
                    }
                }
            }
        }
        gs.dispose();
        bufferedImage.flush();
        
        ImageIO.write(bufferedImage, "png", new File("D:/qrcode.png"));
    }

}

生成的结果如下:

image

这里需要注意的是,二维码长宽不能想zxing之直接定义,需要跟进这个公式生成67+12*(version-1)。比如我直接定义二维码的长宽为300.就会变成如下样子。
image这上面空白看的不是太清,你把图片下载下载下来看就比较明显了。

3.2.2 解析二维码
package cn.rivamed.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 ReadQRCode {

    public static void main(String[] args) throws IOException {
        File file=new File("D:/qrcode.png");
        BufferedImage bufferedImage=ImageIO.read(file);
        QRCodeDecoder codeDecoder=new QRCodeDecoder();
        String result=new String(codeDecoder.decode(new QRCodeImage() {
            
            @Override
            public int getWidth() {
                // TODO Auto-generated method stub
                return bufferedImage.getWidth();
            }
            
            @Override
            public int getPixel(int arg0, int arg1) {
                // TODO Auto-generated method stub
                return bufferedImage.getRGB(arg0, arg1);
            }
            
            @Override
            public int getHeight() {
                // TODO Auto-generated method stub
                return bufferedImage.getHeight();
            }
        }),"gb2312");
        System.out.println(result);
    }

}

4.结束语


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值