|
第一種:QRCode.jar,使用QRCode生成和解析二維碼 1.導(dǎo)入jar包
? ?2.代碼 (1)QRCodeUtil .java 1 import com.swetake.util.Qrcode;
2 import jp.sourceforge.qrcode.QRCodeDecoder;
3
4 import javax.imageio.ImageIO;
5 import java.awt.*;
6 import java.awt.image.BufferedImage;
7 import java.io.File;
8
9 public class QRCodeUtil {
10 /**
11 *加密: 文字信息 ->二維碼.png
12 * @param content 文字信息
13 * @param imgPath 二維碼路徑
14 * @param imgType 二維碼類型:png
15 * @param size 二維碼尺寸
16 * @throws Exception
17 */
18 public void encoderQRCode(String content,String imgPath,String imgType,int size) throws Exception{
19 //BufferedImage :內(nèi)存中的一張圖片
20 BufferedImage bufImg = qRcodeCommon(content,imgType,size);
21
22 File file = new File(imgPath);// "src/二維碼.png" --> 二維碼.png
23
24 //生成圖片
25 ImageIO.write(bufImg, imgType, file);
26 }
27
28 /**
29 *產(chǎn)生一個(gè)二維碼的BufferedImage
30 * @param content 二維碼隱藏信息
31 * @param imgType 圖片格式
32 * @param size 圖片大小
33 * @return
34 */
35 private BufferedImage qRcodeCommon(String content, String imgType, int size) throws Exception {
36 BufferedImage bufImg =null;
37 //Qrcode對(duì)象:字符串->boolean[][]
38 Qrcode qrCodeHandler = new Qrcode();
39 //設(shè)置二維碼的排錯(cuò)率:7% L<M<Q<H30% :排錯(cuò)率越高,可存儲(chǔ)的信息越少;但是對(duì)二維碼清晰對(duì)要求越小
40 qrCodeHandler.setQrcodeErrorCorrect('M');
41 //可存放的信息類型:N:數(shù)字、 A:數(shù)字 A-Z B:所有
42 qrCodeHandler.setQrcodeEncodeMode('B');
43 //尺寸:取值范圍:1-40
44 qrCodeHandler.setQrcodeVersion(size);
45
46 //"Hello world" -> byte[]"Hello world" -->boolean[][]
47 byte[] contentBytes = content.getBytes("UTF-8");
48 boolean[][] codeOut = qrCodeHandler.calQrcode(contentBytes);
49
50 int imgSize = 67 12*(size -1) ;
51
52 //BufferedImage:內(nèi)存中的圖片
53 bufImg = new BufferedImage(imgSize,imgSize,BufferedImage.TYPE_INT_RGB );//red green blue
54
55 //創(chuàng)建一個(gè)畫板
56 Graphics2D gs = bufImg.createGraphics();
57 gs.setBackground(Color.WHITE);//將畫板的背景色設(shè)置為白色
58 gs.clearRect( 0,0, imgSize,imgSize); //初始化
59 gs.setColor(Color.BLACK);//設(shè)置 畫板上 圖像的顏色(二維碼的顏色)
60
61 int pixoff = 2 ;
62
63 for(int j=0;j<codeOut.length;j ) {
64 for(int i=0;i<codeOut.length;i ) {
65 if(codeOut[j][i]) {
66 gs.fillRect(j*3 pixoff , i*3 pixoff, 3, 3);
67 }
68 }
69 }
70 //增加LOGO
71 //將硬盤中的src/logo.png 加載為一個(gè)Image對(duì)象
72 Image logo = ImageIO.read(new File("/src/logo.png") ) ;
73 int maxHeight = bufImg.getHeight();
74 int maxWdith = bufImg.getWidth();
75
76 //在已生成的二維碼上 畫logo
77 gs.drawImage(logo,imgSize/5*2,imgSize/5*2, maxWdith/5,maxHeight/5 ,null) ;
78
79 gs.dispose(); //釋放空間
80 bufImg.flush(); //清理
81 return bufImg ;
82 }
83
84 //解密: 二維碼(圖片路徑) -> 文字信息
85 public String decoderQRCode(String imgPath) throws Exception{
86
87 //BufferedImage內(nèi)存中的圖片 :硬盤中的imgPath圖片 ->內(nèi)存BufferedImage
88 BufferedImage bufImg = ImageIO.read( new File(imgPath) ) ;
89 //解密
90 QRCodeDecoder decoder = new QRCodeDecoder() ;
91
92 TwoDimensionCodeImage tdcImage = new TwoDimensionCodeImage(bufImg);
93 byte[] bs = decoder.decode(tdcImage) ; //bufImg
94 //byte[] -->String
95 String content = new String(bs,"UTF-8");
96 return content;
97 }
98
99
100 }
?(2)TwoDimensionCodeImage .java 1 import jp.sourceforge.qrcode.data.QRCodeImage;
2
3 import java.awt.image.BufferedImage;
4
5 public class TwoDimensionCodeImage implements QRCodeImage {
6 BufferedImage bufImg; //將圖片加載到內(nèi)存中
7 public TwoDimensionCodeImage(BufferedImage bufImg) {
8 this.bufImg = bufImg;
9 }
10 public int getWidth() {
11 return bufImg.getWidth();
12 }
13
14 public int getHeight() {
15 return bufImg.getHeight();
16 }
17
18 public int getPixel(int x, int y) {
19 return bufImg.getRGB(x,y);
20 }
21 }
?(3)Test .java 1 public class Test {
2 public static void main(String[] args) throws Exception{
3 //生成二維碼
4 /*
5 * 生成圖片的路徑 src/二維碼.png
6 * 文字信息、網(wǎng)址信息 : "helloworld"
7 */
8 String imgPath = "e:\\二維碼2.png";
9 String content = "http://baidu.com"; //掃描二維碼后,網(wǎng)頁(yè)跳轉(zhuǎn)
10
11 //生成二維碼
12 /*
13 * 加密: 文字信息 ->二維碼
14 * 解密: 二維碼 -> 文字信息
15 */
16 QRCodeUtil qrUtil = new QRCodeUtil();
17 //加密: 文字信息 ->二維碼
18 qrUtil.encoderQRCode(content, imgPath, "png", 17);
19
20 // TwoDimensionCode handler = new TwoDimensionCode();
21 // handler.encoderQRCode(content, imgPath, "png", 7);
22
23
24 // //解密: 二維碼 -> 文字信息
25 String imgContent = qrUtil.decoderQRCode(imgPath) ;
26 System.out.println(imgContent);
27
28
29 }
30 }
第二種:借助Google提供的ZXing Core工具包 1.maven依賴 1 <dependency> 2 <groupId>com.google.zxing</groupId> 3 <artifactId>core</artifactId> 4 <version>3.4.0</version> 5 </dependency> 6 <dependency> 7 <groupId>com.google.zxing</groupId> 8 <artifactId>javase</artifactId> 9 <version>3.3.1</version> 10 </dependency> 2.代碼 (1)ZXingUtil .java 1 import com.google.zxing.*;
2 import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
3 import com.google.zxing.common.BitMatrix;
4 import com.google.zxing.common.HybridBinarizer;
5 import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
6 import jp.sourceforge.qrcode.util.Color;
7
8 import javax.imageio.ImageIO;
9 import java.awt.image.BufferedImage;
10 import java.io.File;
11 import java.util.HashMap;
12 import java.util.Hashtable;
13 import java.util.Map;
14
15 public class ZXingUtil {
16 public static void encodeImg(String imgPath,String format,String content,int width,int height,String logo) throws Exception {
17 Hashtable<EncodeHintType,Object > hints = new Hashtable<EncodeHintType,Object>() ;
18 //排錯(cuò)率 L<M<Q<H
19 hints.put( EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H) ;
20 //編碼
21 hints.put( EncodeHintType.CHARACTER_SET, "utf-8") ;
22 //外邊距:margin
23 hints.put( EncodeHintType.MARGIN, 1) ;
24 /*
25 * content : 需要加密的 文字
26 * BarcodeFormat.QR_CODE:要解析的類型(二維碼)
27 * hints:加密涉及的一些參數(shù):編碼、排錯(cuò)率
28 */
29 BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE,width,height, hints);
30 //內(nèi)存中的一張圖片:此時(shí)需要的圖片 是二維碼-> 需要一個(gè)boolean[][] ->BitMatrix
31 BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
32
33 for(int x=0;x<width;x ) {
34 for(int y=0;y<height;y ) {
35 image.setRGB(x, y, (bitMatrix.get(x,y)? Color.BLACK:Color.WHITE) );
36 }
37 }
38 //畫logo
39 image = LogoUtil.logoMatrix(image, logo) ;
40 //string->file
41 File file = new File(imgPath);
42 //生成圖片
43 ImageIO.write(image, format, file);
44 }
45
46 //解密:二維碼->文字
47 public static void decodeImg(File file) throws Exception {
48 if(!file.exists()) return ;
49 //file->內(nèi)存中的一張圖片
50 BufferedImage imge = ImageIO.read(file) ;
51
52 MultiFormatReader formatReader = new MultiFormatReader() ;
53 LuminanceSource source = new BufferedImageLuminanceSource(imge);
54 Binarizer binarizer = new HybridBinarizer(source);
55 BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
56 //圖片 ->result
57 Map map = new HashMap();
58 map.put(EncodeHintType.CHARACTER_SET, "utf-8") ;
59 Result result = formatReader.decode(binaryBitmap ,map ) ;
60 System.out.println("解析結(jié)果:" result.toString());
61 }
62
63 }
(2)LogoUtil .java 1 import javax.imageio.ImageIO;
2 import java.awt.*;
3 import java.awt.geom.RoundRectangle2D;
4 import java.awt.image.BufferedImage;
5 import java.io.File;
6 import java.io.IOException;
7
8 public class LogoUtil {
9 //傳入logo、二維碼 ->帶logo的二維碼
10 public static BufferedImage logoMatrix( BufferedImage matrixImage,String logo ) throws IOException {
11 //在二維碼上畫logo:產(chǎn)生一個(gè) 二維碼畫板
12 Graphics2D g2 = matrixImage.createGraphics();
13
14 //畫logo: String->BufferedImage(內(nèi)存)
15 BufferedImage logoImg = ImageIO.read(new File(logo));
16 int height = matrixImage.getHeight();
17 int width = matrixImage.getWidth();
18 //純logo圖片
19 g2.drawImage(logoImg, width * 2 / 5, height * 2 / 5, width * 1 / 5, height * 1 / 5, null);
20
21 //產(chǎn)生一個(gè) 畫 白色圓角正方形的 畫筆
22 BasicStroke stroke = new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
23 //將畫板-畫筆 關(guān)聯(lián)
24 g2.setStroke(stroke);
25 //創(chuàng)建一個(gè)正方形
26 RoundRectangle2D.Float round = new RoundRectangle2D.Float(width * 2 / 5, height * 2 / 5, width * 1 / 5, height * 1 / 5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
27 g2.setColor(Color.WHITE);
28 g2.draw(round);
29
30 //灰色邊框
31 BasicStroke stroke2 = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
32 g2.setStroke(stroke2);
33 //創(chuàng)建一個(gè)正方形
34 RoundRectangle2D.Float round2 = new RoundRectangle2D.Float(width * 2 / 5 2, height * 2 / 5 2, width * 1 / 5 - 4, height * 1 / 5 - 4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
35 // Color color = new Color(128,128,128) ;
36 g2.setColor(Color.GRAY);
37 g2.draw(round2);
38
39 g2.dispose();
40 matrixImage.flush();
41
42 return matrixImage;
43 }
44 }
(3)test.java 1 import java.io.File;
2
3 public class test {
4 public static void main(String[] args) throws Exception {
5 String imgPath = "src/二維碼12.png";
6 String content = "helloworld你好";
7 String logo = "src/logo.png";
8 //加密:文字信息->二維碼
9 ZXingUtil.encodeImg(imgPath, "png",content, 430, 430,logo);
10 //解密:二維碼 ->文字信息
11 ZXingUtil.decodeImg(new File(imgPath));
12 }
13 }
(效果圖)
? 來源:https://www./content-1-274601.html |
|
|