什么是二维码?请参考:二维码详解
java 生成二维码 QRCode、zxing 两种方式
1、下载所需要的 jar 包
所需要的 jar 包下载地址:java生成二维码所需要的QRCode、zxing Jar包
如果你想自行分别下载:
zxing github地址:https://github.com/zxing/zxing,参考:获取Java生成二维码所需要的Jar包(zxing方式)
获取QRcode.jar, 下载链接:http://www.swetake.com/qrcode/java/qr_java.html (官网) ,注意:这个只是编码的。
QRCode 的解决包下载地址:https://zh.osdn.net/projects/qrcode/releases/
如果你的是Maven工程,添加依赖包的方式请参考:将 jar 包加入到 Maven 库
如果是普通Java工程,参考:Java项目如何添加第三方 jar 包引用
生成的二维码:
![img_ad16ebcba17970cd7af6787bd622e863.png](https://yqfile.alicdn.com/img_ad16ebcba17970cd7af6787bd622e863.png?x-oss-process=image/resize,w_1400/format,webp)
QRCode 方式:
importjava.awt.Color;
importjava.awt.Graphics2D;
importjava.awt.Image;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjavax.imageio.ImageIO;
importcom.swetake.util.Qrcode;
/**
* 二维码工具类
* 实现输入字符串(文本,网址)生成对应的二维码二维码实质是01代码,具有4个等级的容错能力
* QRCodeUtils
*@authorlipw
*@date2018年8月1日下午4:52:01
*/
publicclassQRCodeUtils{
/**
* 二维码可包含的内容
* EncodeMode
*@authorlipw
*@date2018年8月1日下午4:47:15
*/
publicclassEncodeMode{
/**
* N代表的是数字
*/
publicfinalstaticcharN ='N';
/**
* A代表的是a-z
*/
publicfinalstaticcharA='A';
/**
* B代表的是其他字符
*/
publicfinalstaticcharB ='B';
}
/**
* 二维码的容错能力等级
* 二维码容错率用字母表示,容错能力等级分为:L、M、Q、H四级
* 二维码具有容错功能,当二维码图片被遮挡一部分后,仍可以扫描出来。
* 容错的原理是二维码在编码过程中进行了冗余,就像是123被编码成123123,这样只要扫描到一部分二维码图片,
* 二维码内容还是可以被全部读到。
* 二维码容错率即是指二维码图标被遮挡多少后,仍可以被扫描出来的能力。容错率越高,则二维码图片能被遮挡的部分越多。
* ErrorCorrect
*@authorlipw
*@date2018年8月1日下午4:49:17
*/
publicclassErrorCorrect{
/**
* 低,最大 7% 的错误能够被纠正
*/
publicfinalstaticcharL ='L';
/**
* 中,最大 15% 的错误能够被纠正
*/
publicfinalstaticcharM ='M';
/**
* 中上,最大 25% 的错误能够被纠正
*/
publicfinalstaticcharQ ='Q';
/**
* 高,最大 30% 的错误能够被纠正
*/
publicfinalstaticcharH ='H';
}
/**
* 基于 QRCode 创建二维码
*@authorlipw
*@date2018年8月2日上午10:21:57
*@paramcontent 要写入二维码的内容
*@paramsavePath 完整的保存路径
*@paramversion 版本
*@paramlogoPath 完整的logo路径,可以为:null
*@return
*/
publicstaticbooleanCreateQRCode(String content, String savePath,intversion, String logoPath){
// 创建生成二维码的对象
Qrcode qrcode =newQrcode();
// 设置二维码的容错能力等级
qrcode.setQrcodeErrorCorrect(ErrorCorrect.M);
// N代表的是数字,A代表的是a-z,B代表的是其他字符
qrcode.setQrcodeEncodeMode(EncodeMode.B);
// 版本
qrcode.setQrcodeVersion(version);
// 设置验证码的大小
intwidth =67+12* (version -1);
intheight =67+12* (version -1);
// 定义缓冲区图片
BufferedImage bufferedImage =newBufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 设置画图工具
Graphics2D gs = bufferedImage.createGraphics();
// 设置二维码背景颜色
gs.setBackground(Color.white);//lightGray
// 设置颜色
gs.setColor(Color.black);//cyan,green,red,black,pink
// 清除画板内容
gs.clearRect(0,0, width, height);
// 定义偏移量
intpixoff =2;
// 填充的内容转化为字节数
byte[] ctt;
try{
ctt = content.getBytes("utf-8");
// 设置编码方式
if(ctt.length >0&& ctt.length <120) {
boolean[][] s = qrcode.calQrcode(ctt);
for(inti =0; i < s.length; i++) {
for(intj =0; j < s.length; j++) {
if(s[j][i]) {
// 验证码图片填充内容
gs.fillRect(j *3+ pixoff, i *3+ pixoff,3,3);
}
}
}
}
/* 判断是否需要添加logo图片 */
if(logoPath !=null){
File icon =newFile(logoPath);
if(icon.exists()){
intwidth_4 = width /4;
intwidth_8 = width_4 /2;
intheight_4 = height /4;
intheight_8 = height_4 /2;
Image img = ImageIO.read(icon);
gs.drawImage(img, width_4 + width_8, height_4 + height_8,width_4,height_4,null);
}else{
System.out.println("Error: login图片不存在!");
}
}
// 结束写入
gs.dispose();
// 结束内存图片
bufferedImage.flush();
// 保存生成的二维码图片
ImageIO.write(bufferedImage,"png",newFile(savePath));
returntrue;
}catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
returnfalse;
}
publicstaticvoidmain(String[] args){
String content ="http://www.wei-xiao.top/";
String savePath ="/Users/aven/Desktop/qrcode.png";
intversion =9;
String logoPath ="/Users/aven/Desktop/logo.png";
booleanresult = CreateQRCode(content, savePath, version, logoPath);
if(result){
System.out.println("\n二维码图片生成成功!");
}else{
System.out.println("\n二维码图片生成失败!");
}
}
}
说明:二维码中间加一个 Logo 的方式是很简单粗暴的,就是利用二维码的容错能力,直接在生成好的二维码图片上覆盖一张图片上去。
参考:
本文考虑写入《JavaEE实战——从本地到云端》 一书中
版权声明:自由转载-非商用-非衍生-保持署名-注明出处