java创建QRCode二维码的三种方式

Java 专栏收录该内容
12 篇文章 0 订阅

自己在网上看视频学习了下如何使用java创建二维码,感觉还是挺有趣的,有小心思的还可以把秘密存入二维码中噢

视频源网址:http://www.imooc.com/learn/531

点击下载jar包


二维码的类别

二维码依据码制的编码原理,通常分为三种:

线性堆叠式二维码、矩阵式二维码、邮政码。

  1. 线性堆叠式二维码:建立在一维条码基础上,按需要堆积成两行或多行。与一维码很类似。
  2. 矩阵式二维码:(最常用)在一个矩阵空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其它形状)的出现表示二进制“1”,点的不出现表示二进制的“0”。QR CODE
  3. 邮政码:通过不同长度的条进行编码,主要用于邮件编码。
二维码详解:

优缺点

二维码优点:

	(1)高密度编码,信息容量大;
	(2)编码范围广;
	(3)容错能力强;
	(4)编码可靠性高;
	(5)可引入加密措施;
	(6)成本低,易制作,持久耐用。

二维码缺点:

	(1)二维码技术成为手机病毒、钓鱼网站传播的新渠道;
	(2)信息泄露。


三大国际标准

  1. PDF417:不支持中文
  2. DM:专利未公开,需支付专利费
  3. QRCode:专利公开,支持中文

因为QRCode 支持中文,免费。读取速度快,数据密度大,占用空间小的优势。本次只介绍怎么生成QRCode二维码
纠错等级:
L级:7%   
M级:15%  
Q级:25%  
H级:30%

JSP生成二维码的方法: --jar包在页头

①借助第三方jar,如zxing和qrcodejar ②JavaScript,如jquery.qrcode.js


1.zxing方式

/**
     * 使用zxing创建QrCode格式二维码 
     * @param content 二维码的内容
     * @param fullPath 完整的资源存储路径
     */
    public static void createQrCode(String content, String fullPath) {
        //定义宽高和图片格式和二维码内容
        int width = 300;
        int height = 300;
        String format = "png";
        /*String content = "";*/

        //定义文件路径
        /*Path filePath = new File("E:/JavaExcelTest/QrCode02.png").toPath();*/
        Path filePath = new File(fullPath).toPath();

        //定义二维码参数:编码格式
        HashMap config = new HashMap();
        config.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        //二维码的纠错等级:L,M,Q,H.从低到高,纠错等级越高,所存储的数据就越少
        config.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        //二维码的空白间隔值,默认为5
        config.put(EncodeHintType.MARGIN, 2);
        MultiFormatWriter mfw = new MultiFormatWriter();
        try {
            //BarcodeFormat.QR_CODE是一种二维码的格式
            BitMatrix bm = mfw.encode(content, BarcodeFormat.QR_CODE, width, height, config);
            //写入资源
            MatrixToImageWriter.writeToPath(bm, format, filePath);
        } catch (WriterException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("写入完毕!");
    }

    /**
     * 使用zxings解析QrCode格式二维码
     * @param fullPath 完整的资源存储路劲
     */
    public static void readQrCode(String fullPath) {
        try {
            MultiFormatReader multiFormatReader = new MultiFormatReader();
            File file = new File(fullPath);
            //读取资源转为图片
            BufferedImage image = ImageIO.read(file);
            BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(
                new BufferedImageLuminanceSource(image)));
            //解析为result对象
            Result result = multiFormatReader.decode(binaryBitmap);
            System.out.println("二维码数据: " + result.toString());
            System.out.println("二维码编码格式: " + result.getBarcodeFormat());
            System.out.println("二维码内容: " + result.getText());
        } catch (NotFoundException e) {
            System.out.println("文件未找到!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2.QRCode

/**
     * 通过QRCode创建QrCode
     * @param content 二维码的文本内容
     * @param fullPath 二维码的存储路径
     */
    public static void createQrCode(String content, String fullPath) {
        Qrcode qrCode = new Qrcode();
        qrCode.setQrcodeErrorCorrect('M');//纠错等级
        qrCode.setQrcodeVersion('7');//版本号1-40
        qrCode.setQrcodeEncodeMode('B');//'N'是数字,'A'是a-Z,'B'是其他字符

        //宽高公式:width=67+12*(版本号-1)
        int width = 67 + 12 * (7 - 1);
        int height = 67 + 12 * (7 - 1);

        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D grap = bufferedImage.createGraphics();
        //设置背景
        grap.setBackground(Color.white);
        //设置画笔颜色
        grap.setColor(Color.black);
        //清除画板
        grap.clearRect(0, 0, width, height);

        //偏移量,防止解析发生异常
        int pixoff = 2;

        try {
            //字节转换
            byte[] contentByte = content.getBytes("UTF-8");
            if (contentByte.length > 0 && contentByte.length < 120) {
                boolean[][] s = qrCode.calQrcode(contentByte);
                for (int i = 0; i < s.length; i++) {
                    for (int j = 0; j < s.length; j++) {
                        if (s[j][i]) {
                            grap.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
                        }
                    }
                }
            }
            grap.dispose();
            bufferedImage.flush();
            ImageIO.write(bufferedImage, "png", new File(fullPath));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("写入成功");
    }

    /**
     * 通过QRCode解析QRCode
     * @param fullPath 二维码的存储路径
     */
    public static void readQrCode(String fullPath) {
        File file = new File(fullPath);
        try {
            BufferedImage bufferedImage = ImageIO.read(file);
            //创建QRCode解析实例
            QRCodeDecoder qrCode = new QRCodeDecoder();
            /*
             * 解析
             * qrCode.decode(QrCodeImage qrCodeImage)
             * qrCodeImage是一个接口,无法实例化,需自定义类并实现QRCodeImage接口
             */
            String result = new String(qrCode.decode(new MyQrCodeImage(bufferedImage)), "UTF-8");
            System.out.println(result);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

QRCodeImage实现类:
package com.qrCode;

import java.awt.image.BufferedImage;

import jp.sourceforge.qrcode.data.QRCodeImage;

public class MyQrCodeImage implements QRCodeImage {

    BufferedImage bufferedImage;

    public MyQrCodeImage(BufferedImage bufferedImage) {
        this.bufferedImage = bufferedImage;
    }

    @Override
    public int getHeight() {
        return this.bufferedImage.getHeight();
    }

    //获取像素
    @Override
    public int getPixel(int x, int y) {
        return this.bufferedImage.getRGB(x, y);
    }

    @Override
    public int getWidth() {
        return this.bufferedImage.getWidth();
    }

}

3.jQuery方式:最简单,但支持功能太少,不支持中文

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.entity.User" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.qrcode.min.js"></script>
<style type="text/css">
body{
background-color: #fff;
}
.main{
width:500px;
height:200px;
margin: auto auto;
text-align: center;
}
</style>
</head>
<body>
<div class="qrcode"></div>
</body>
<script type="text/javascript">
$(function(){
	 $(".qrcode").qrcode("阿拉蕾 "); 
	
})

</script>
</html>



  • 0
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值