1 package com.mohe.twocode;
2
3
4 import java.awt.Color;
5 import java.awt.Graphics2D;
6 import java.awt.image.BufferedImage;
7 import java.io.File;
8 import java.io.IOException;
9 import java.io.InputStream;
10 import java.io.OutputStream;
11
12
13 import javax.imageio.ImageIO;
14
15
16 import jp.sourceforge.qrcode.QRCodeDecoder;
17 import jp.sourceforge.qrcode.data.QRCodeImage;
18 import jp.sourceforge.qrcode.exception.DecodingFailedException;
19
20
21 import com.swetake.util.Qrcode;
22
23
24 public class TwoDimensionCode implements QRCodeImage {
25
26
27 private BufferedImage bufImg = null;
28
29
30 public TwoDimensionCode() {
31
32
33 }
34
35
36 public TwoDimensionCode(BufferedImage bufImg) {
37 this.bufImg = bufImg;
38 }
39
40
41 @Override
42 public int getHeight() {
43 return bufImg.getHeight();
44 }
45
46
47 @Override
48 public int getPixel(int x, int y) {
49 return bufImg.getRGB(x, y);
50 }
51
52
53 @Override
54 public int getWidth() {
55 return bufImg.getWidth();
56 }
57
58
59 /**
60 * 生成二维码(QRCode)图片
61 *
62 * @param content
63 * 存储内容
64 * @param imgPath
65 * 图片路径
66 */
67 public void encoderQRCode(String content, String imgPath) {
68 this.encoderQRCode(content, imgPath, "png", 7);
69 }
70
71
72 /**
73 * 生成二维码(QRCode)图片
74 *
75 * @param content
76 * 存储内容
77 * @param output
78 * 输出流
79 */
80 public void encoderQRCode(String content, OutputStream output) {
81 this.encoderQRCode(content, output, "png", 7);
82 }
83
84
85 /**
86 * 生成二维码(QRCode)图片
87 *
88 * @param content
89 * 存储内容
90 * @param imgPath
91 * 图片路径
92 * @param imgType
93 * 图片类型
94 */
95 public void encoderQRCode(String content, String imgPath, String imgType) {
96 this.encoderQRCode(content, imgPath, imgType, 7);
97 }
98
99
100 /**
101 * 生成二维码(QRCode)图片
102 *
103 * @param content
104 * 存储内容
105 * @param output
106 * 输出流
107 * @param imgType
108 * 图片类型
109 */
110 public void encoderQRCode(String content, OutputStream output, String imgType) {
111 this.encoderQRCode(content, output, imgType, 7);
112 }
113
114
115 /**
116 * 生成二维码(QRCode)图片
117 *
118 * @param content
119 * 存储内容
120 * @param imgPath
121 * 图片路径
122 * @param imgType
123 * 图片类型
124 * @param size
125 * 二维码尺寸
126 */
127 public void encoderQRCode(String content, String imgPath, String imgType, int size) {
128 try {
129 BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);
130
131
132 File imgFile = new File(imgPath);
133
134
135 if (!imgFile.exists()) {
136 imgFile.mkdirs();
137 }
138
139
140 // 生成二维码QRCode图片
141 ImageIO.write(bufImg, imgType, imgFile);
142
143
144 } catch (Exception e) {
145 e.printStackTrace();
146 }
147 }
148
149
150 /**
151 * 生成二维码(QRCode)图片
152 *
153 * @param content
154 * 存储内容
155 * @param output
156 * 输出流
157 * @param imgType
158 * 图片类型
159 * @param size
160 * 二维码尺寸
161 */
162 public void encoderQRCode(String content, OutputStream output, String imgType, int size) {
163 try {
164 BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);
165 // 生成二维码QRCode图片
166 ImageIO.write(bufImg, imgType, output);
167 } catch (Exception e) {
168 e.printStackTrace();
169 }
170 }
171
172
173 /**
174 * 生成二维码(QRCode)图片的公共方法
175 *
176 * @param content
177 * 存储内容
178 * @param imgType
179 * 图片类型
180 * @param size
181 * 二维码尺寸
182 * @return
183 */
184 private BufferedImage qRCodeCommon(String content, String imgType, int size) {
185 BufferedImage bufImg = null;
186 try {
187 Qrcode qrcodeHandler = new Qrcode();
188 // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
189 qrcodeHandler.setQrcodeErrorCorrect('M');
190 qrcodeHandler.setQrcodeEncodeMode('B');
191 // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
192 qrcodeHandler.setQrcodeVersion(size);
193 // 获得内容的字节数组,设置编码格式
194 byte[] contentBytes = content.getBytes("utf-8");
195 // 图片尺寸
196 int imgSize = 67 + 12 * (size - 1);
197 bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
198 Graphics2D gs = bufImg.createGraphics();
199 // 设置背景颜色
200 gs.setBackground(Color.WHITE);
201 gs.clearRect(0, 0, imgSize, imgSize);
202
203
204 // 设定图像颜色> BLACK
205 gs.setColor(Color.BLACK);
206 // 设置偏移量,不设置可能导致解析出错
207 int pixoff = 2;
208 // 输出内容> 二维码
209 if (contentBytes.length > 0 && contentBytes.length < 800) {
210 boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
211 for (int i = 0; i < codeOut.length; i++) {
212 for (int j = 0; j < codeOut.length; j++) {
213 if (codeOut[j][i]) {
214 gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
215 }
216 }
217 }
218 } else {
219 throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");
220 }
221 gs.dispose();
222 bufImg.flush();
223 } catch (Exception e) {
224 e.printStackTrace();
225 }
226 return bufImg;
227 }
228
229
230 /**
231 * 解析二维码(QRCode)
232 *
233 * @param imgPath
234 * 图片路径
235 * @return
236 */
237 public String decoderQRCode(String imgPath) {
238 // QRCode 二维码图片的文件
239 File imageFile = new File(imgPath);
240 BufferedImage bufImg = null;
241 String content = null;
242 try {
243 bufImg = ImageIO.read(imageFile);
244 QRCodeDecoder decoder = new QRCodeDecoder();
245 content = new String(decoder.decode(new TwoDimensionCode(bufImg)), "utf-8");
246 } catch (IOException e) {
247 System.out.println("Error: " + e.getMessage());
248 e.printStackTrace();
249 } catch (DecodingFailedException dfe) {
250 System.out.println("Error: " + dfe.getMessage());
251 dfe.printStackTrace();
252 }
253 return content;
254 }
255
256
257 /**
258 * 解析二维码(QRCode)
259 *
260 * @param input
261 * 输入流
262 * @return
263 */
264 public String decoderQRCode(InputStream input) {
265 BufferedImage bufImg = null;
266 String content = null;
267 try {
268 bufImg = ImageIO.read(input);
269 QRCodeDecoder decoder = new QRCodeDecoder();
270 content = new String(decoder.decode(new TwoDimensionCode(bufImg)), "utf-8");
271 } catch (IOException e) {
272 System.out.println("Error: " + e.getMessage());
273 e.printStackTrace();
274 } catch (DecodingFailedException dfe) {
275 System.out.println("Error: " + dfe.getMessage());
276 dfe.printStackTrace();
277 }
278 return content;
279 }
280
281
282 /**
283 * 生成二维码
284 *
285 * @param filePath
286 * @return
287 */
288 public static void encoder(String filePath, String deskCode) {
289
290
291 String imgPath = filePath + deskCode + ".png";
292 TwoDimensionCode handler = new TwoDimensionCode();
293 handler.encoderQRCode(deskCode, imgPath, "png");
294 }
295
296
297 /**
298 * 解析二维码
299 *
300 * @param filePath
301 * @return
302 */
303 public static String decoder(String filePath, int deskType, String deskCode) {
304
305
306 String imgPath = filePath + deskCode + ".png";
307 TwoDimensionCode handler = new TwoDimensionCode();
308 return handler.decoderQRCode(imgPath);
309 }
310
311
312 /**
313 * 生成中间带LOG二维码(QRCode)图片
314 *
315 * @param content
316 * 二维码图片的内容
317 * @param imgPath
318 * 生成二维码图片完整的路径
319 * @param ccbpath
320 * 二维码图片中间的logo路径
321 */
322 public static int createQRCode(String content, String imgPath, String ccbPath) {
323
324
325 try {
326 Qrcode qrcodeHandler = new Qrcode();
327 qrcodeHandler.setQrcodeErrorCorrect('M');
328 qrcodeHandler.setQrcodeEncodeMode('B');
329 qrcodeHandler.setQrcodeVersion(7);
330
331
332 // System.out.println(content);
333 byte[] contentBytes = content.getBytes("utf-8");
334 BufferedImage bufImg = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB);
335 Graphics2D gs = bufImg.createGraphics();
336
337
338 gs.setBackground(Color.WHITE);
339 gs.clearRect(0, 0, 140, 140);
340
341
342 // 设定图像颜色 > BLACK
343 // gs.setColor(new Color(255, 200, 0));
344 gs.setColor(Color.BLACK);
345
346
347 // 设置偏移量 不设置可能导致解析出错
348 int pixoff = 2;
349
350
351 // 输出内容 > 二维码
352 if (contentBytes.length > 0 && contentBytes.length < 120) {
353 boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
354 for (int i = 0; i < codeOut.length; i++) {
355 for (int j = 0; j < codeOut.length; j++) {
356 if (codeOut[j][i]) {
357 gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
358 }
359 }
360 }
361 } else {
362 System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,120 ]. ");
363 return -1;
364 }
365 // Image img = ImageIO.read(new File(ccbPath));// 实例化一个Image对象。
366 // gs.drawImage(img, 47, 54, null);
367 // gs.setColor(Color.BLUE);
368 // gs.setFont(new Font("微软雅黑", Font.BOLD, 18));
369 // gs.drawString("交享越", 50, 70);
370 // gs.dispose();
371 bufImg.flush();
372
373
374 // 生成二维码QRCode图片
375 File imgFile = new File(imgPath);
376 ImageIO.write(bufImg, "png", imgFile);
377
378
379 } catch (Exception e) {
380 e.printStackTrace();
381 return -100;
382 }
383
384
385 return 0;
386 }
387
388
389 public static void main(String[] args) {
390 // String imgPath = "F:/TDDOWNLOAD/Michael_QRCode.png";
391 // String encoderContent = "123131";
392 // TwoDimensionCode handler = new TwoDimensionCode();
393 // handler.encoderQRCode(encoderContent, imgPath, "png");
394 // // try {
395 // // OutputStream output = new FileOutputStream(imgPath);
396 // // handler.encoderQRCode(content, output);
397 // // } catch (Exception e) {
398 // // e.printStackTrace();
399 // // }
400 // System.out.println("========encoder success");
401 //
402 // String decoderContent = handler.decoderQRCode(imgPath);
403 // System.out.println("解析结果如下:");
404 // System.out.println(decoderContent);
405 // System.out.println("========decoder success!!!");
406
407
408 // TwoDimensionCode
409 // .createQRCode(
410 // "http://jxy.misuland.com//jxy_manager//downLoadAction!downLoad.action?path=jxy_android.apk",
411 // "F://jxy_android.png",
412 // "C:\\Documents and Settings\\Administrator\\My Documents\\My Pictures\\image\\white.jpg");
413 TwoDimensionCode.createQRCode("http://localhost:8080//jxy_manager//downLoadAction!downLoad.action?path=jxy_android.apk", "F://jxy_android.png", "C:\\Documents and Settings\\Administrator\\My Documents\\My Pictures\\image\\white.jpg");
414 TwoDimensionCode.createQRCode("http://localhost:8080//jxy_manager//downLoadAction!downLoad.action?path=jxy_ios.apk", "F://jxy_ios.png", "C:\\Documents and Settings\\Administrator\\My Documents\\My Pictures\\image\\white.jpg");
415 }
416 }
417
418
419
420
421
422 所需jar包可以在这个地址下载http://download.csdn.net/detail/daixinmei/5974269