Java利用QRCode.jar包实现二维码编码与解码

Wesley13
• 阅读 500

QRcode是日本人94年开发出来的。首先去QRCode的官网http://swetake.com/qrcode/java/qr_java.html,把要用的jar包下下来,导入到项目里去。qrcode需要设置一个版本号,这个版本号代表你生成的二维码的像素的大小。版本1是21*21的,版本号每增加1,边长增加4。也就是说版本7的大小是45 * 45的。版本号最大值是40。另外,版本7的编码的字节数如果超过了119,那么将无法编码

1.二维码图片类实现

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  com.reyo.code;

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();

}

}

 2.二维码编解码类实现

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

package  com.reyo.code;

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,  10 );

}

/**

* 生成二维码(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 =  "C:\\zhaochao.png" ;

String encoderContent = "" ;

for ( int  i= 0 ;i< 40 ;i++)

encoderContent+= "锐洋智能" ;

TwoDimensionCode handler =  new  TwoDimensionCode();

handler.encoderQRCode(encoderContent, imgPath,  "png" , 10 );

System.out.println( "=============编码成功!图片为于:" +imgPath+ "===============" );

String decoderContent = handler.decoderQRCode(imgPath);

System.out.println( "============解析结果如下:===============" );

System.out.println(decoderContent);

System.out.println( "=========解码成功===========" );

}

}

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这