二維碼,是一種采用黑白相間的平面幾何圖形通過相應的編碼算法來記錄文字、圖片、網址等信息的條碼圖片。如下圖
二維碼的特點:
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二維碼生成與解析的資料整理,后續繼續補充,謝謝大家對本站的支持!