使用zxing批量在做好的立牌背景圖的指定位置上,把指定的文本內(nèi)容(鏈接地址、文本等)生成二維碼并放在該位置,最后加上立牌編號(hào)。
步驟:
1).做好背景圖,如下圖:
2).生成二維碼BufferedImage對(duì)象。代碼如下:
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: 把文本轉(zhuǎn)化成二維碼圖片對(duì)象 * @param text * 二維碼內(nèi)容 * @param width * 二維碼高度 * @param height * 二位寬度 * @param * @param Exception * 設(shè)定文件 * @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" ); // 內(nèi)容所使用字符集編碼 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對(duì)象 * @param srcImgPath * 背景圖 * @param targerPath * 目標(biāo)圖 * @param positionWidth * 位置橫坐標(biāo) * @param positionHeight * 位置縱坐標(biāo) * @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、得到畫筆對(duì)象 Graphics2D g = buffImg.createGraphics(); // 2、設(shè)置對(duì)線段的鋸齒狀邊緣處理 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會(huì)失真) 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).在立牌上加上立牌編號(hào)
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 * 文字內(nèi)容 * @param srcImageFile * 原圖片 * @param destImageFile * 目標(biāo)圖片 * @param x * 橫坐標(biāo) * @param y * 縱坐標(biāo) * @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 ); // 設(shè)置顏色 g.setColor( new Color( 89 , 87 , 87 )); // 設(shè)置 Font g.setFont( new Font( "方正蘭亭中黑_GBK" , Font.BOLD, 14 )); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 第一參數(shù)->設(shè)置的內(nèi)容,后面兩個(gè)參數(shù)->文字在圖片上的坐標(biāo)位置(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/" ; // 二維碼內(nèi)容 // 生成二維碼 //生成圖片二維碼存放目錄 String targetPath = "f:/qrcode/targetimg/" + Utils.toStr(); //創(chuàng)建目錄 Utils.makeDirs(targetPath); int begin = 100 ; //code 開始數(shù)字 int end = 101 ; //code結(jié)束數(shù)字 for ( int i = begin; i <= end; i++) { //生成含日期的16位數(shù)字如20161214000001 String code = Utils.toStr() + Utils.formateNumber(i); //獲取二維碼對(duì)象 BufferedImage image = Utils.toBufferedImage(text + "?payCode=" + code, 240 , 240 ); //生成含背景圖+二維碼的立牌的圖 Utils.markImageByCode(image, "f:/qrcode/srcimg/src.png" , targetPath + "/" + code + ".png" , 340 , 160 ); //立牌的圖加上code編號(hào) Utils.pressText(code, targetPath + "/" + code + ".png" , targetPath + "/" + code + ".png" , 390 , 417 , 0 .5f); } // 生成二維碼 } } |
效果:
批量生成的圖片效果圖如下
批量圖:
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: 把文本轉(zhuǎn)化成二維碼圖片對(duì)象 * @param text * 二維碼內(nèi)容 * @param width * 二維碼高度 * @param height * 二位寬度 * @param * @param Exception * 設(shè)定文件 * @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" ); // 內(nèi)容所使用字符集編碼 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對(duì)象 * @param srcImgPath * 背景圖 * @param targerPath * 目標(biāo)圖 * @param positionWidth * 位置橫坐標(biāo) * @param positionHeight * 位置縱坐標(biāo) * @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、得到畫筆對(duì)象 Graphics2D g = buffImg.createGraphics(); // 2、設(shè)置對(duì)線段的鋸齒狀邊緣處理 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會(huì)失真) 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 * 文字內(nèi)容 * @param srcImageFile * 原圖片 * @param destImageFile * 目標(biāo)圖片 * @param x * 橫坐標(biāo) * @param y * 縱坐標(biāo) * @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 ); // 設(shè)置顏色 g.setColor( new Color( 89 , 87 , 87 )); // 設(shè)置 Font g.setFont( new Font( "方正蘭亭中黑_GBK" , Font.BOLD, 14 )); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 第一參數(shù)->設(shè)置的內(nèi)容,后面兩個(gè)參數(shù)->文字在圖片上的坐標(biāo)位置(x,y) . g.drawString(pressText, x, y); g.dispose(); ImageIO.write((BufferedImage) image, "PNG" , new File(destImageFile)); // 輸出到文件流 } catch (Exception e) { e.printStackTrace(); } } // 日期轉(zhuǎn)字符串 /** 將日期格式化為String,默認(rèn)格式為yyyy-MM-dd HH:mm:ss,默認(rèn)日期為當(dāng)前日期. */ public static String toStr() { return toStr(DF_DATETIME); } /** 將日期格式化為String,格式由參數(shù)format指定,默認(rèn)日期為當(dāng)前日期,format值可使用本類常量或自定義. */ public static String toStr(String format) { return toStr(format, new Date()); } /** 將日期格式化為String,默認(rèn)格式為yyyy-MM-dd HH:mm:ss,日期由參數(shù)date指定. */ public static String toStr(Date date) { return toStr(DF_DATETIME, date); } /** 將日期格式化為String,格式由參數(shù)format指定,日期由參數(shù)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(); } } |
使用的技術(shù):
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 > |
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://blog.csdn.net/mr_smile2014/article/details/53641304