最近和一位前辈学习生成二维码(Zxing,Qrcode,Jquery)3种方式,整理了一份简单资料分享给大家。本人编码阅历有限,下文代码中存在编码规范问题,还请多多留言。
下文所提到的工具包:双击免费工具包下载
提取码:gm03
Zxing
谷歌推出的一款开源项目。
需要包:
zxing-3.3.2.jar
创建二维码
package student.com.zxing;
import java.io.File;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.UUID;
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;
/**
*
* @author Bad Written
*
*/
public class CreateZxing {
/**
*
* @param content
* @param width
* @param height
* @param charsetName
* @return BitMatrix对象(存储将要生成的二维码的字节数据)
* @throws Exception
*/
public static BitMatrix createBitMatrix(String content, int width, int height,String charsetName) throws Exception{
//要生成什么格式的二维码
BitMatrix bitMatrix=null;
//二维码当中要存储什么信息
HashMap<EncodeHintType, Comparable> hints = new HashMap<EncodeHintType, Comparable>();
hints.put(EncodeHintType.CHARACTER_SET, charsetName);
//设置纠错率,分为L、M、H三个等级,等级越高,纠错率越高,但存储的信息越少
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
//设置一下边距,默认是5
hints.put(EncodeHintType.MARGIN, 2);
bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
return bitMatrix;
}
/**
*
* @param content 内容
* @param format 图片格式
* @param width 图片宽
* @param height 高
* @param charsetName 编码格式
* @param filepath 文件路径
* @throws Exception
*/
public static void create(String content,String format, int width, int height,String charsetName,String filepath) throws Exception{
BitMatrix bitMatrix=CreateZxing.createBitMatrix(content, width, height,charsetName);
File file=new File(filepath+File.separator+UUID.randomUUID().toString().replace("-", "")+"."+format);
Path path = file.toPath();
MatrixToImageWriter.writeToPath(bitMatrix, format, path);
}
public static void main(String[] args){
System.out.println("开始");
try{
CreateZxing.create("Zxing生成二维码!","png",300,300,"utf-8","E:/code");
System.out.println("成功");
}catch(Exception e){
e.printStackTrace();
}
}
}
生成结果如图:
读取二维码
package study.com.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.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
/**
*
* @author Bad Written
*
*/
public class ReadZxingCode {
public static Result read(String filepath,String charsetName) throws IOException, NotFoundException{
Result result=null;
MultiFormatReader mfr=new MultiFormatReader();
File file=new File(filepath);
BufferedImage img=ImageIO.read(file);
BinaryBitmap binaryBitmap=new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(img)));
HashMap hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET,charsetName);
result=mfr.decode(binaryBitmap,hints);
return result;
}
public static void main(String[] args){
System.out.println("开始");
Result result;
try {
result = ReadZxingCode.read("E:/code/d4ebf9c4917f401da607df77ac50a346.png","utf-8");
System.out.println(result.toString());
} catch (NotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
QRcode
包:1.2\qrcode-1.2.jar
创建二维码
package study.com.qrcode;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import javax.imageio.ImageIO;
import com.swetake.util.Qrcode;
/*
* 基于Graphics2D画图工具
*/
public class CreateQRCode {
/**
* 返回一个图片缓存
*
* @param context 图片内容
* @param size 二维码版本
* @charsetName 编码格式
* @return
* @throws IOException
*/
private static BufferedImage createbuf(String context,int size,String charsetName) throws IOException{
//二维码类
Qrcode qr=new Qrcode();
//纠错等级
qr.setQrcodeErrorCorrect('M');
//代表其他字符
qr.setQrcodeEncodeMode('B');
//设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
qr.setQrcodeVersion(size);
//二维码大小
int width=67+12*(size-1);//公式
int height=67+12*(size-1);
//缓冲区图片
BufferedImage bufimg=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//画图工具
Graphics2D gs=bufimg.createGraphics();
gs.setBackground(Color.WHITE);
gs.setColor(Color.BLACK);
//设置画板
gs.clearRect(0, 0, width, height);
//内容编码
byte[] d=context.getBytes(charsetName);
int pixoff=2;//偏移量
// 输出内容> 二维码
if(d.length>0 && d.length<120){
boolean[][] s=qr.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();
bufimg.flush();
return bufimg;
}
/**
*
* @param context 内容
* @param size 版本
* @param type 图片格式
* @param imgpath 图片路径
* @throws IOException
*/
public static void create(String context,int size,String type,String imgpath) throws IOException{
BufferedImage bufimg=CreateQRCode.createbuf(context,size,"gb2312");
File file=new File(imgpath+File.separator+UUID.randomUUID().toString().replace("-", "")+"."+type);
ImageIO.write(bufimg, type, file);
}
public static void main(String[] args) {
System.out.println("开始"+File.separator);
try{
CreateQRCode.create("Qrcode生成二维码", 7, "png", "E:/code");
System.out.println("成功");
}catch(IOException e){
System.out.println("失败");
e.printStackTrace();
}
}
}
生成二维码如图:
读取二维码
主工具类
package study.com.qrcode;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import jp.sourceforge.qrcode.QRCodeDecoder;
public class ReadQrCode {
/**
*
* @param filepath 文件路径
* @param charsetName 编码格式
* @return 解析出来结果
* @throws IOException
*/
public static String read(String filepath,String charsetName) throws IOException{
String result=null;
File file=new File(filepath);
BufferedImage img=ImageIO.read(file);
QRCodeDecoder qrCodeDecoder=new QRCodeDecoder();
result=new String(qrCodeDecoder.decode(new QrCodeImgImp(img)),charsetName);
return result;
}
public static void main(String[] args) throws IOException{
String str=ReadQrCode.read("E:/code/qrcode.png","gb2312");
System.out.println("解析:"+str);
}
}
副类
package study.com.qrcode;
import java.awt.image.BufferedImage;
import jp.sourceforge.qrcode.data.QRCodeImage;
public class QrCodeImgImp implements QRCodeImage {
BufferedImage bufimg;
public QrCodeImgImp(BufferedImage bufimg){
this.bufimg=bufimg;
}
public int getHeight() {
// TODO Auto-generated method stub
return bufimg.getHeight();
}
public int getPixel(int arg0, int arg1) {
// TODO Auto-generated method stub
return bufimg.getRGB(arg0, arg1);
}
public int getWidth() {
// TODO Auto-generated method stub
return bufimg.getWidth();
}
}
JQuery
导入相应的JS
jquery.qrcode.min.js
jquery-3.3.1.min.js
生成二维码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>生成二维码</title>
</head>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery.qrcode.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#qrcode').qrcode(
{
render : "canvas", //设置渲染方式,有table和canvas,使用canvas方式渲染性能相对来说比较好
text : "http://www.baidu.com", //扫描二维码后显示的内容,可以直接填一个网址,扫描二维码后自动跳向该链接
width : "200", //二维码的宽度
height : "200", //二维码的高度
background : "#ffffff", //二维码的后景色
foreground : "#000000", //二维码的前景色
});
}
)
</script>
<body>
生成二维码如下
<center>
<div id="qrcode"></div>
</center>
<h3>显示结束</h3>
</body>
</html>