服务器之家

服务器之家 > 正文

java中使用zxing批量生成二维码立牌

时间:2020-07-14 17:45     来源/作者:Mr_Smile2014

使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址、文本等)生成二维码并放在该位置,最后加上立牌编号。

步骤:

1).做好背景图,如下图:

java中使用zxing批量生成二维码立牌

2).生成二维码BufferedImage对象。代码如下:

?
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
/**
  *
  * @Title: toBufferedImage
  * @Description: 把文本转化成二维码图片对象
  * @param text
  *   二维码内容
  * @param width
  *   二维码高度
  * @param height
  *   二位宽度
  * @param
  * @param Exception
  *   设定文件
  * @return BufferedImage 返回类型
  * @throws
  */
 public static BufferedImage toBufferedImage(String text, int width,
   int height) throws Exception {
  int BLACK = 0xFF000000;
  int WHITE = 0xFFFFFFFF;
  Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
  hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 内容所使用字符集编码
  hints.put(EncodeHintType.MARGIN, 1);
  BitMatrix matrix = new MultiFormatWriter().encode(text,
    BarcodeFormat.QR_CODE, width, height, hints);
  BufferedImage image = new BufferedImage(width, height,
    BufferedImage.TYPE_INT_RGB);
  for (int x = 0; x < width; x++) {
   for (int y = 0; y < height; y++) {
    image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
   }
  }
  return image;
 }

3).在立牌背景图的指定位置上生成二维码,代码如下:

?
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
/**
  *
  * @Title: markImageByCode
  * @Description: 向图片指定位置增加二维码
  * @param img
  *   二维码image对象
  * @param srcImgPath
  *   背景图
  * @param targerPath
  *   目标图
  * @param positionWidth
  *   位置横坐标
  * @param positionHeight
  *   位置纵坐标
  * @return void 返回类型
  * @throws
  */
 public static void markImageByCode(Image img, String srcImgPath,
   String targerPath, int positionWidth, int positionHeight) {
  OutputStream os = null;
  try {
 
   Image srcImg = ImageIO.read(new File(srcImgPath));
 
   BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
     srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
 
   // 1、得到画笔对象
   Graphics2D g = buffImg.createGraphics();
 
   // 2、设置对线段的锯齿状边缘处理
   g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
     RenderingHints.VALUE_INTERPOLATION_BILINEAR);
 
   g.drawImage(
     srcImg.getScaledInstance(srcImg.getWidth(null),
       srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
     null);
 
   g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
     alpha));
 
   // 3、二维码位置
   g.drawImage(img, positionWidth, positionHeight, null);
   g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
   // 4、释放资源
   g.dispose();
 
   // 5、生成图片(建议生成PNG的,jpg会失真)
   os = new FileOutputStream(targerPath);
   ImageIO.write(buffImg, "PNG", os);
 
   System.out.println("二维码图片生成成功");
 
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    if (null != os)
     os.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }

4).在立牌上加上立牌编号

?
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
/**
  *
  * @Title: pressText
  * @Description:向图片指定位置加上文字
  * @param pressText
  *   文字内容
  * @param srcImageFile
  *   原图片
  * @param destImageFile
  *   目标图片
  * @param x
  *   横坐标
  * @param y
  *   纵坐标
  * @param alpha
  *   透明度
  * @return void 返回类型
  * @throws
  */
 public final static void pressText(String pressText, String srcImageFile,
   String destImageFile, int x, int y, float alpha) {
  try {
   File img = new File(srcImageFile);
   Image src = ImageIO.read(img);
   int width = src.getWidth(null);
   int height = src.getHeight(null);
   BufferedImage image = new BufferedImage(width, height,
     BufferedImage.TYPE_INT_RGB);
   Graphics2D g = image.createGraphics();
   // 开文字抗锯齿 去文字毛刺
   g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
     RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
   g.drawImage(src, 0, 0, width, height, null);
   // 设置颜色
   g.setColor(new Color(89, 87, 87));
   // 设置 Font
   g.setFont(new Font("方正兰亭中黑_GBK", Font.BOLD, 14));
   g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
     alpha));
   // 第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) .
   g.drawString(pressText, x, y);
   g.dispose();
   ImageIO.write((BufferedImage) image, "PNG", new File(destImageFile));// 输出到文件流
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

示例:

代码:

测试代码

?
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
public class codeTest {
 public static void main(String[] args) throws Exception {
  String text = "http://www.xxx.com/"; // 二维码内容
 
  // 生成二维码
  //生成图片二维码存放目录
  String targetPath = "f:/qrcode/targetimg/" + Utils.toStr();
  //创建目录
  Utils.makeDirs(targetPath);
   
  int begin = 100;//code 开始数字
  int end = 101;//code结束数字
  for (int i = begin; i <= end; i++) {
   //生成含日期的16位数字如20161214000001
   String code = Utils.toStr() + Utils.formateNumber(i);
   //获取二维码对象
   BufferedImage image = Utils.toBufferedImage(text
     + "?payCode=" + code,240,240);
   //生成含背景图+二维码的立牌的图
   Utils.markImageByCode(image, "f:/qrcode/srcimg/src.png",
     targetPath + "/" + code + ".png", 340, 160);
   //立牌的图加上code编号
   Utils.pressText(code, targetPath + "/" + code + ".png", targetPath
     + "/" + code + ".png", 390, 417, 0.5f);
  }
  // 生成二维码
 }
}

效果:

批量生成的图片效果图如下

java中使用zxing批量生成二维码立牌

批量图:

java中使用zxing批量生成二维码立牌

utils代码:

?
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
package cn.utils.code;
 
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;
 
import javax.imageio.ImageIO;
 
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
 
/** 工具类. */
public abstract class Utils {
 
 /** 日期格式:yyyy-MM-dd HH:mm:ss */
 public static String DF_DATETIME = "yyyyMMdd";
 private static float alpha = 1f;
 
 /**
  *
  * @Title: toBufferedImage
  * @Description: 把文本转化成二维码图片对象
  * @param text
  *   二维码内容
  * @param width
  *   二维码高度
  * @param height
  *   二位宽度
  * @param
  * @param Exception
  *   设定文件
  * @return BufferedImage 返回类型
  * @throws
  */
 public static BufferedImage toBufferedImage(String text, int width,
   int height) throws Exception {
  int BLACK = 0xFF000000;
  int WHITE = 0xFFFFFFFF;
  Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
  hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 内容所使用字符集编码
  hints.put(EncodeHintType.MARGIN, 1);
  BitMatrix matrix = new MultiFormatWriter().encode(text,
    BarcodeFormat.QR_CODE, width, height, hints);
  BufferedImage image = new BufferedImage(width, height,
    BufferedImage.TYPE_INT_RGB);
  for (int x = 0; x < width; x++) {
   for (int y = 0; y < height; y++) {
    image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
   }
  }
  return image;
 }
 
 /**
  *
  * @Title: markImageByCode
  * @Description: 向图片指定位置增加二维码
  * @param img
  *   二维码image对象
  * @param srcImgPath
  *   背景图
  * @param targerPath
  *   目标图
  * @param positionWidth
  *   位置横坐标
  * @param positionHeight
  *   位置纵坐标
  * @return void 返回类型
  * @throws
  */
 public static void markImageByCode(Image img, String srcImgPath,
   String targerPath, int positionWidth, int positionHeight) {
  OutputStream os = null;
  try {
 
   Image srcImg = ImageIO.read(new File(srcImgPath));
 
   BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
     srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
 
   // 1、得到画笔对象
   Graphics2D g = buffImg.createGraphics();
 
   // 2、设置对线段的锯齿状边缘处理
   g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
     RenderingHints.VALUE_INTERPOLATION_BILINEAR);
 
   g.drawImage(
     srcImg.getScaledInstance(srcImg.getWidth(null),
       srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
     null);
 
   g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
     alpha));
 
   // 3、二维码位置
   g.drawImage(img, positionWidth, positionHeight, null);
   g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
   // 4、释放资源
   g.dispose();
 
   // 5、生成图片(建议生成PNG的,jpg会失真)
   os = new FileOutputStream(targerPath);
   ImageIO.write(buffImg, "PNG", os);
 
   System.out.println("二维码图片生成成功");
 
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    if (null != os)
     os.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
 
 /**
  *
  * @Title: pressText
  * @Description:向图片指定位置加上文字
  * @param pressText
  *   文字内容
  * @param srcImageFile
  *   原图片
  * @param destImageFile
  *   目标图片
  * @param x
  *   横坐标
  * @param y
  *   纵坐标
  * @param alpha
  *   透明度
  * @return void 返回类型
  * @throws
  */
 public final static void pressText(String pressText, String srcImageFile,
   String destImageFile, int x, int y, float alpha) {
  try {
   File img = new File(srcImageFile);
   Image src = ImageIO.read(img);
   int width = src.getWidth(null);
   int height = src.getHeight(null);
   BufferedImage image = new BufferedImage(width, height,
     BufferedImage.TYPE_INT_RGB);
   Graphics2D g = image.createGraphics();
   // 开文字抗锯齿 去文字毛刺
   g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
     RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
   g.drawImage(src, 0, 0, width, height, null);
   // 设置颜色
   g.setColor(new Color(89, 87, 87));
   // 设置 Font
   g.setFont(new Font("方正兰亭中黑_GBK", Font.BOLD, 14));
   g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
     alpha));
   // 第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) .
   g.drawString(pressText, x, y);
   g.dispose();
   ImageIO.write((BufferedImage) image, "PNG", new File(destImageFile));// 输出到文件流
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 
 // 日期转字符串
 
 /** 将日期格式化为String,默认格式为yyyy-MM-dd HH:mm:ss,默认日期为当前日期. */
 public static String toStr() {
  return toStr(DF_DATETIME);
 }
 
 /** 将日期格式化为String,格式由参数format指定,默认日期为当前日期,format值可使用本类常量或自定义. */
 public static String toStr(String format) {
  return toStr(format, new Date());
 }
 
 /** 将日期格式化为String,默认格式为yyyy-MM-dd HH:mm:ss,日期由参数date指定. */
 public static String toStr(Date date) {
  return toStr(DF_DATETIME, date);
 }
 
 /** 将日期格式化为String,格式由参数format指定,日期由参数date指定,format值可使用本类常量或自定义. */
 public static String toStr(String format, Date date) {
  return new SimpleDateFormat(format).format(date);
 }
 
 public static String formateNumber(int num) {
  DecimalFormat df = new DecimalFormat("000000");
  String str2 = df.format(num);
  return str2;
 }
 
 public static boolean makeDirs(String filePath) {
 
  File folder = new File(filePath);
  return (folder.exists() && folder.isDirectory()) ? true : folder
    .mkdirs();
 }
 
}

使用的技术:

1.使用的zxing生成二维码工具。

1)下载地址:http://repo1.maven.org/maven2/com/google/zxing/javase/3.1.0/

2).maven配置

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/mr_smile2014/article/details/53641304

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
返回顶部