您的位置:首页 > 编程语言 > Java开发

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

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

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

点击下载jar包

二维码的类别

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



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

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



优缺点


二维码优点:

(1)高密度编码,信息容量大;

(2)编码范围广;

(3)容错能力强;

(4)编码可靠性高;

(5)可引入加密措施;

(6)成本低,易制作,持久耐用。

二维码缺点:

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

(2)信息泄露。



三大国际标准

PDF417:不支持中文
DM:专利未公开,需支付专利费
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: