java使用zxing制作二维码

因为项目需要,我封装了三个不同的二维码构建,一个是制作普通的二维码,一个是带logo的,还有一个是带logo和文字的,不废话,直接上代码。

添加依赖

1
2
3
4
5
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
package com.pibgstar.demo.utils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
* @author pibigstar
* @create 2018-11-29 10:17
* @desc 二维码生成工具类
**/
public class ZXingCodeUtil {
// 二维码颜色
private static final int QRCOLOR = 0xFF000000;
// 背景色
private static final int BGCOLOR = 0xFFFFFFFF;
// 二维码宽度
private static final int width = 400;
// 二维码高度
private static final int height = 400;

/**
* @Author:pibigstar
* @Description: 生成普通的二维码
* @Date:
*/
public static BufferedImage createCode(String qrUrl) {
MultiFormatWriter multiFormatWriter = null;
BitMatrix bm = null;
BufferedImage image = null;
Map<EncodeHintType, Object> hints = getDecodeHintType();
try {
multiFormatWriter = new MultiFormatWriter();
// 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数
bm = multiFormatWriter.encode(qrUrl, BarcodeFormat.QR_CODE, width, height, hints);
int w = bm.getWidth();
int h = bm.getHeight();
image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

// 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGCOLOR);
}
}
} catch (WriterException e) {
e.printStackTrace();
}
return image;
}

/**
* @Author:pibigstar
* @Description: 生成带logo的二维码
* @Date:
*/
public static BufferedImage createCodeWithLogo(String qrUrl, String logoPath) {
BufferedImage bim = createCode(qrUrl);
try {
// 读取二维码图片,并构建绘图对象
BufferedImage image = bim;
Graphics2D g = image.createGraphics();

// 读取Logo图片
BufferedImage logo = ImageIO.read(new File(logoPath));
//设置logo的大小,这里设置为二维码图片的20%,过大会盖掉二维码
int widthLogo = logo.getWidth(null) > image.getWidth() * 3 / 10 ? (image.getWidth() * 3 / 10) : logo.getWidth(null),
heightLogo = logo.getHeight(null) > image.getHeight() * 3 / 10 ? (image.getHeight() * 3 / 10) : logo.getWidth(null);

// logo放在中心
int x = (image.getWidth() - widthLogo) / 2;
int y = (image.getHeight() - heightLogo) / 2;
// logo放在右下角
// int x = (image.getWidth() - widthLogo);
// int y = (image.getHeight() - heightLogo);

//开始绘制图片
g.drawImage(logo, x, y, widthLogo, heightLogo, null);
g.dispose();
logo.flush();
image.flush();
return image;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

/**
* @Author:pibigstar
* @Description: 生成带logo和文字的二维码
* @Date:
*/
public static BufferedImage createCodeWithLogoAndText(String qrUrl, String logoPath, String text) {
BufferedImage image = createCodeWithLogo(qrUrl, logoPath);
//把文字添加上去,文字不要太长,这里最多支持两行。太长就会自动截取啦
try {
if (text != null && !text.equals("")) {
//新的图片,把带logo的二维码下面加上文字
BufferedImage outImage = new BufferedImage(400, 445, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D outg = outImage.createGraphics();
//画二维码到新的面板
outg.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
//画文字到新的面板
outg.setColor(Color.BLACK);
outg.setFont(new Font("宋体", Font.BOLD, 30)); //字体、字型、字号
int strWidth = outg.getFontMetrics().stringWidth(text);
if (strWidth > 399) {
// //长度过长就截取前面部分
// outg.drawString(productName, 0, image.getHeight() + (outImage.getHeight() - image.getHeight())/2 + 5 ); //画文字
//长度过长就换行
String productName1 = text.substring(0, text.length() / 2);
String productName2 = text.substring(text.length() / 2, text.length());
int strWidth1 = outg.getFontMetrics().stringWidth(productName1);
int strWidth2 = outg.getFontMetrics().stringWidth(productName2);
outg.drawString(productName1, 200 - strWidth1 / 2, image.getHeight() + (outImage.getHeight() - image.getHeight()) / 2 + 12);
BufferedImage outImage2 = new BufferedImage(400, 485, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D outg2 = outImage2.createGraphics();
outg2.drawImage(outImage, 0, 0, outImage.getWidth(), outImage.getHeight(), null);
outg2.setColor(Color.BLACK);
outg2.setFont(new Font("宋体", Font.BOLD, 30)); //字体、字型、字号
outg2.drawString(productName2, 200 - strWidth2 / 2, outImage.getHeight() + (outImage2.getHeight() - outImage.getHeight()) / 2 + 5);
outg2.dispose();
outImage2.flush();
outImage = outImage2;
} else {
outg.drawString(text, 200 - strWidth / 2, image.getHeight() + (outImage.getHeight() - image.getHeight()) / 2 + 12); //画文字
}
outg.dispose();
outImage.flush();
image = outImage;
image.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
return image;
}

/**
* @Author:pibigstar
* @Description: 构建二维码
* @Date:
*/
private static BufferedImage create(String qrUrl, String logoPath, String text) {
MultiFormatWriter multiFormatWriter = null;
BitMatrix bm = null;
BufferedImage image = null;
Map<EncodeHintType, Object> hints = getDecodeHintType();
try {
multiFormatWriter = new MultiFormatWriter();
// 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数
bm = multiFormatWriter.encode(qrUrl, BarcodeFormat.QR_CODE, width, height, hints);
int w = bm.getWidth();
int h = bm.getHeight();
image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

// 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGCOLOR);
}
}
} catch (WriterException e) {
e.printStackTrace();
}
return image;
}

/**
* 设置二维码的格式参数
* @return
*/
private static Map<EncodeHintType, Object> getDecodeHintType() {
// 用于设置QR二维码参数
Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
// 设置QR二维码的纠错级别(H为最高级别)具体级别信息
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 设置编码方式
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.MARGIN, 0);
hints.put(EncodeHintType.MAX_SIZE, 350);
hints.put(EncodeHintType.MIN_SIZE, 100);
return hints;
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TestZxingCodeUtil {

public static void main(String[] args) throws IOException {
BufferedImage bim = ZXingCodeUtil.createCode("http://www.pibigstar.com");
ImageIO.write(bim, "png", new File("D:\\Document And Settings3\\Admin\\Desktop\\" + new Date().getTime() + ".png"));

bim = ZXingCodeUtil.createCodeWithLogo("http://www.pibigstar.com","D:\\Document And Settings3\\Admin\\Desktop\\文本资料\\网站\\qq.png");
ImageIO.write(bim, "png", new File("D:\\Document And Settings3\\Admin\\Desktop\\" + new Date().getTime() + ".png"));

bim = ZXingCodeUtil.createCodeWithLogoAndText("http://www.pibigstar.com","D:\\Document And Settings3\\Admin\\Desktop\\文本资料\\网站\\qq.png","派大星博客");
ImageIO.write(bim, "png", new File("D:\\Document And Settings3\\Admin\\Desktop\\" + new Date().getTime() + ".png"));

System.out.println("done");
}
}

生成效果

1. 普通二维码

2. 带logo的二维码

3. 带logo和文字的二维码

-------------本文结束感谢您的阅读-------------