激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java 二維碼的生成與解析示例代碼

java 二維碼的生成與解析示例代碼

2020-06-02 11:48人生設計師 JAVA教程

本文主要介紹java二維碼的生成與解析,這里提供示例代碼以便大家參考和理解,希望能幫助開發Java 二維碼的朋友

二維碼,是一種采用黑白相間的平面幾何圖形通過相應的編碼算法來記錄文字、圖片、網址等信息的條碼圖片。如下圖

java 二維碼的生成與解析示例代碼

二維碼的特點:

1.  高密度編碼,信息容量大

可容納多達1850個大寫字母或2710個數字或1108個字節,或500多個漢字,比普通條碼信息容量約高幾十倍。

2.  編碼范圍廣

該條碼可以把圖片、聲音、文字、簽字、指紋等可以數字化的信息進行編碼,用條碼表示出來;可以表示多種語言文字;可表示圖像數據。

3.  容錯能力強,具有糾錯功能

這使得二維條碼因穿孔、污損等引起局部損壞時,照樣可以正確得到識讀,損毀面積達50%仍可恢復信息。

4.  譯碼可靠性高

它比普通條碼譯碼錯誤率百萬分之二要低得多,誤碼率不超過千萬分之一。

5.  可引入加密措施

保密性、防偽性好。

6.  成本低,易制作,持久耐用

正因為以上這些特點,二維碼現在越來越流行,應用也是越來越廣(詳細了解請見百度百科,介紹不是本篇重點),所以掌握如何開發二維碼是非常不錯的知識儲備,因此本篇文章將為大家講解如何生成、解析二維碼。

 一、Java

所需jar包:QRCode.jar

http://sourceforge.jp/projects/qrcode/

TwoDimensionCode類:二維碼操作核心類

?
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
package qrcode;
 
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import javax.imageio.ImageIO;
 
import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.exception.DecodingFailedException;
 
import com.swetake.util.Qrcode;
 
public class TwoDimensionCode {
 
 /**
 * 生成二維碼(QRCode)圖片
 * @param content 存儲內容
 * @param imgPath 圖片路徑
 */
 public void encoderQRCode(String content, String imgPath) {
 this.encoderQRCode(content, imgPath, "png", 7);
 }
 
 /**
 * 生成二維碼(QRCode)圖片
 * @param content 存儲內容
 * @param output 輸出流
 */
 public void encoderQRCode(String content, OutputStream output) {
 this.encoderQRCode(content, output, "png", 7);
 }
 
 /**
 * 生成二維碼(QRCode)圖片
 * @param content 存儲內容
 * @param imgPath 圖片路徑
 * @param imgType 圖片類型
 */
 public void encoderQRCode(String content, String imgPath, String imgType) {
 this.encoderQRCode(content, imgPath, imgType, 7);
 }
 
 /**
 * 生成二維碼(QRCode)圖片
 * @param content 存儲內容
 * @param output 輸出流
 * @param imgType 圖片類型
 */
 public void encoderQRCode(String content, OutputStream output, String imgType) {
 this.encoderQRCode(content, output, imgType, 7);
 }
 
 /**
 * 生成二維碼(QRCode)圖片
 * @param content 存儲內容
 * @param imgPath 圖片路徑
 * @param imgType 圖片類型
 * @param size 二維碼尺寸
 */
 public void encoderQRCode(String content, String imgPath, String imgType, int size) {
 try {
 BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);
 
 File imgFile = new File(imgPath);
 // 生成二維碼QRCode圖片
 ImageIO.write(bufImg, imgType, imgFile);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 
 /**
 * 生成二維碼(QRCode)圖片
 * @param content 存儲內容
 * @param output 輸出流
 * @param imgType 圖片類型
 * @param size 二維碼尺寸
 */
 public void encoderQRCode(String content, OutputStream output, String imgType, int size) {
 try {
 BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);
 // 生成二維碼QRCode圖片
 ImageIO.write(bufImg, imgType, output);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 
 /**
 * 生成二維碼(QRCode)圖片的公共方法
 * @param content 存儲內容
 * @param imgType 圖片類型
 * @param size 二維碼尺寸
 * @return
 */
 private BufferedImage qRCodeCommon(String content, String imgType, int size) {
 BufferedImage bufImg = null;
 try {
 Qrcode qrcodeHandler = new Qrcode();
 // 設置二維碼排錯率,可選L(7%)、M(15%)、Q(25%)、H(30%),排錯率越高可存儲的信息越少,但對二維碼清晰度的要求越小
 qrcodeHandler.setQrcodeErrorCorrect('M');
 qrcodeHandler.setQrcodeEncodeMode('B');
 // 設置設置二維碼尺寸,取值范圍1-40,值越大尺寸越大,可存儲的信息越大
 qrcodeHandler.setQrcodeVersion(size);
 // 獲得內容的字節數組,設置編碼格式
 byte[] contentBytes = content.getBytes("utf-8");
 // 圖片尺寸
 int imgSize = 67 + 12 * (size - 1);
 bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
 Graphics2D gs = bufImg.createGraphics();
 // 設置背景顏色
 gs.setBackground(Color.WHITE);
 gs.clearRect(0, 0, imgSize, imgSize);
 
 // 設定圖像顏色> BLACK
 gs.setColor(Color.BLACK);
 // 設置偏移量,不設置可能導致解析出錯
 int pixoff = 2;
 // 輸出內容> 二維碼
 if (contentBytes.length > 0 && contentBytes.length < 800) {
 boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
 for (int i = 0; i < codeOut.length; i++) {
 for (int j = 0; j < codeOut.length; j++) {
 if (codeOut[j][i]) {
 gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
 }
 }
 }
 } else {
 throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");
 }
 gs.dispose();
 bufImg.flush();
 } catch (Exception e) {
 e.printStackTrace();
 }
 return bufImg;
 }
 
 /**
 * 解析二維碼(QRCode)
 * @param imgPath 圖片路徑
 * @return
 */
 public String decoderQRCode(String imgPath) {
 // QRCode 二維碼圖片的文件
 File imageFile = new File(imgPath);
 BufferedImage bufImg = null;
 String content = null;
 try {
 bufImg = ImageIO.read(imageFile);
 QRCodeDecoder decoder = new QRCodeDecoder();
 content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");
 } catch (IOException e) {
 System.out.println("Error: " + e.getMessage());
 e.printStackTrace();
 } catch (DecodingFailedException dfe) {
 System.out.println("Error: " + dfe.getMessage());
 dfe.printStackTrace();
 }
 return content;
 }
 
 /**
 * 解析二維碼(QRCode)
 * @param input 輸入流
 * @return
 */
 public String decoderQRCode(InputStream input) {
 BufferedImage bufImg = null;
 String content = null;
 try {
 bufImg = ImageIO.read(input);
 QRCodeDecoder decoder = new QRCodeDecoder();
 content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");
 } catch (IOException e) {
 System.out.println("Error: " + e.getMessage());
 e.printStackTrace();
 } catch (DecodingFailedException dfe) {
 System.out.println("Error: " + dfe.getMessage());
 dfe.printStackTrace();
 }
 return content;
 }
 
 public static void main(String[] args) {
 String imgPath = "G:/TDDOWNLOAD/Michael_QRCode.png";
 String encoderContent = "Hello 大大、小小,welcome to QRCode!" + "\nMyblog [ http://sjsky.iteye.com ]" + "\nEMail [ [email protected] ]";
 TwoDimensionCode handler = new TwoDimensionCode();
 handler.encoderQRCode(encoderContent, imgPath, "png");
// try {
// OutputStream output = new FileOutputStream(imgPath);
// handler.encoderQRCode(content, output);
// } catch (Exception e) {
// e.printStackTrace();
// }
 System.out.println("========encoder success");
 
 
 String decoderContent = handler.decoderQRCode(imgPath);
 System.out.println("解析結果如下:");
 System.out.println(decoderContent);
 System.out.println("========decoder success!!!");
 }
}

 

 TwoDimensionCodeImage 類:二維碼圖片對象

?
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
package qrcode;
 
import java.awt.image.BufferedImage;
 
import jp.sourceforge.qrcode.data.QRCodeImage;
 
public class TwoDimensionCodeImage implements QRCodeImage {
 
 BufferedImage bufImg;
 
 public TwoDimensionCodeImage(BufferedImage bufImg) {
 this.bufImg = bufImg;
 }
 
 @Override
 public int getHeight() {
 return bufImg.getHeight();
 }
 
 @Override
 public int getPixel(int x, int y) {
 return bufImg.getRGB(x, y);
 }
 
 @Override
 public int getWidth() {
 return bufImg.getWidth();
 }
 
}

 以上就是對java二維碼生成與解析的資料整理,后續繼續補充,謝謝大家對本站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人mm视频在线观看 | 欧美大电影免费观看 | 欧美亚洲国产一区二区三区 | 激情久久免费视频 | 久久久资源网 | 国产精品成aⅴ人片在线观看 | freexxx69性欧美hd | 久久精品爱 | 二区精品视频 | 久久激情国产 | 国产精品一区二区三区在线看 | 亚洲一区二区国产 | 欧美激情精品久久久久久久久久 | 免费在线观看成年人视频 | 国产成年人网站 | 亚洲精品午夜国产va久久成人 | 黄色免费影片 | 圆产精品久久久久久久久久久 | 日产精品久久久一区二区福利 | 日韩一级毛毛片 | 性生活视频一级 | 精品一区在线视频 | 91色综合综合热五月激情 | 色污视频 | 免费久久久 | 本站只有精品 | 国产剧情v888av | 久久久日韩精品一区二区 | 国产亚洲精品久久久久久大师 | 亚洲91在线 | 免费在线观看毛片 | 欧美一级毛片免费观看 | 老女人碰碰在线碰碰视频 | 欧美人与物videos另类 | 黄色aaa视频 | 成人免费自拍视频 | 草草久 | 九草av| 露脸各种姿势啪啪的清纯美女 | 国产99久久精品一区二区 | 天天透天天狠天天爱综合97 |