目 录
一、引用第三方 jar 包说明...........................................................1
二、com.swetake.util.Qrcode 的方法说明..................................... 1
2.1 方法 setqrcodeerrorr().......................................................1
2.2 方法 etqrcodeencodemode()............................................1
2.3 方法 setqrcodeversion().....................................................1
2.4 方法 calQrcode()................................................................1
三、图片中间带 logo 的二维码生成实例......................................2
四、测试类..................................................................................... 4
一、引用第三方 jar 包说明
二维码生成主要通过第三方 jar 包 com.swetake.util.Qrcode 进
行实现的;
jar 下载地址: http://swetake.com/qrcode/java/qr_java.html
Api 地址:http://www.swetake.com/qrcode/java/docs/index.html
二、com.swetake.util.Qrcode 的方法说明
2.1 方法 setqrcodeerrorr()
public void setqrcodeerrorr(char ecc) 设定错误校正级别,
设置二维码的纠错级别(排错率),共有四级:可选 L(7%)、M(15%)、
Q(25%)、H(30%)(最高 H),纠错信息同样存储在二维码中,纠错级别
越高,纠错信息占用的空间越多,那么能存储的有用信息就越少,对
二维码清晰度的要求越小。
参数:char ecc 纠错级别(L、M、Q、H)
2.2 方法 etqrcodeencodemode()
public void setqrcodeencodemode(char encmode)
设定编码模式:“n”:数字模式“a”:英文数字模式其他:8 比
特字节模式
参数:encmode -编码模式(“n”、“a”或其他)
2.3 方法 setqrcodeversion()
public void setqrcodeversion(int ver) 设定版本:设定 0 的话会自
动设定,二维码的版本号也象征着二维码的信息容量;二维码可以看
成一个黑白方格矩阵,版本不同,矩阵长宽方向方格的总数量分别不
同。 1-40 总共 40 个版本,版本 1 为 21*21 矩阵,版本每增 1,二维
码的两个边长都增 4; 版本 2 为 25x25 模块,最高版本为是 40,是
177*177 的矩阵。
参数:int ver 版本(1-40),信息容量
2.4 方法 calQrcode()
public boolean[][] calQrcode(byte[] qrcodeData)
从给定的数据队列中,将 qr 码的编码数据以 boolean 二维数组
的形式返回。
参数:byte[] qrcodeData 二维码内容数组
1
三、图片中间带 logo 的二维码生成实例
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import com.swetake.util.Qrcode;
public class Logo_Two_Code {
/**
* 生成二维码(QRCode)图片
*
* @param content
*
* @param imgPath
*
* @param ccbpath
*
*/
public static int createQRCode(String content, String imgPath,
二维码图片中间的 logo 路径
二维码图片的内容
生成二维码图片完整的路径
String ccbPath) {
try {
// 实例化二维码生成器
Qrcode qrcodeHandler = new Qrcode();
// 设置二维码的纠错级别(排错率),共有四级:可选 L(7%)、M(15%)、Q(25%)、
H(30%)(最高 H)
//纠错信息同样存储在二维码中,纠错级别越高,纠错信息占用的空间越多,那么能存储的有用信息
就越少,对二维码清晰度的要求越小
qrcodeHandler.setQrcodeErrorCorrect('M');
2
// 编码模式 :N 代表数字,A 代表字符 a-Z,B 代表其他字符,二进制
qrcodeHandler.setQrcodeEncodeMode('B');
// 二维码的版本号:也象征着二维码的信息容量;二维码可以看成一个黑白方格矩阵,
版本不同,矩阵长宽方向方格的总数量分别不同。 1-40 总共 40 个版本,版本 1 为 21*21 矩阵,版本每
增 1,二维码的两个边长都增 4; 版本 2 为 25x25 模块,最高版本为是 40,是 177*177 的矩阵;
qrcodeHandler.setQrcodeVersion(8);
// 获取内容的字节数组,设置编码格式
byte[] contentBytes = content.getBytes("gbk");
// 创建一个不带透明色的 BufferedImage 对象 ,其中图片尺寸,会根据 version 的变
大,而变大,自己需要计算
BufferedImage bufImg = new BufferedImage(150, 150,
BufferedImage.TYPE_INT_RGB);
//获取画笔
Graphics2D gs = bufImg.createGraphics();
//设置背景色 白色
gs.setBackground(Color.WHITE);
gs.clearRect(0, 0, 150, 150);
// 设定图像颜色 > BLACK
gs.setColor(Color.black);
// 设置偏移量 不设置可能导致解析出错
int pixoff = 2;
// 输出内容 > 二维码,遍历二维码内容数组
if (contentBytes.length > 0 && contentBytes.length < 150) {
boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
for (int i = 0; i < codeOut.length; i++) {
for (int j = 0; j < codeOut.length; j++) {
if (codeOut[j][i]) {
//填充指定的矩形。该矩形左边缘和右边缘分别位于 x 和 x + width - 1。上边缘和下边缘分别
位于 y 和 y + height - 1。得到的矩形覆盖 width 像素宽乘以 height 像素高的区域。使用图形
3
gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
上下文的当前颜色填充该矩形。
}
}
}
} else {
System.err.println("QRCode content bytes length = "
+ contentBytes.length + " not in [ 0,125]. ");
return -1;
}
// 实例化一个 Image 对象。
Image img = ImageIO.read(new File(ccbPath));
gs.drawImage(img, 60, 60, null);
gs.dispose();
bufImg.flush();
// 生成二维码 QRCode 图片
File imgFile = new File(imgPath);
ImageIO.write(bufImg, "png", imgFile);
} catch (Exception e) {
e.printStackTrace();
return -100;
}
return 0;
}
四、测试类
public static void main(String[] args) {
// 生成二维码图片完整的路径
String imgPath = "D:\\twocode\\Default111.png";
// 二维码图片中 logo 的图片路径
String ccbPath = "D:\\twocode\\Default.png";
4
// 生成二维码的内容
String encoderContent = "www.baidu.com";
// 定义生成二维码的类
Logo_Two_Code logo_Two_Code = new Logo_Two_Code();
// 调用生成二维码的方法
Logo_Two_Code.createQRCode(encoderContent, imgPath, ccbPath);
}
}
5