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

 

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(00, 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, 33); 
                        
                    
                
            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("=========解码成功==========="); 
    

最新文章

  1. 代码的坏味道(15)——冗余类(Lazy Class)
  2. linux文件数相关命令
  3. iBATIS代码生成分析
  4. Openstack+Kubernetes+Docker微服务实践之路--选型
  5. netty-socketio使用namespace
  6. Android--消除“Permission is only granted to system apps”错误
  7. Android学习第一课
  8. poj3393[模拟题]
  9. spoj 416
  10. C#-禁止调整窗体的大小
  11. 【 UVALive - 4287】Proving Equivalences (SCC缩点)
  12. handler.post(r)同一个线程的疑惑
  13. linux c: core dump
  14. [编织消息框架][netty源码分析]11 UnpooledHeapByteBuf 与 ByteBufAllocator
  15. Python内置函数(13)——bytearray
  16. servlet什么时候被实例化?【转】
  17. Windows Server 2016-客户端加域端口汇总
  18. 【interview】卡特兰数
  19. Oracle创建表空间、表、一级用户授权
  20. 两种 js下载文件的方法(转)

热门文章

  1. Java面经入口(持续更新...)
  2. Django框架(八)--单表增删改查,在Python脚本中调用Django环境
  3. 解决debugJDK源码看不到局部变量的值
  4. The Preliminary Contest for ICPC Asia Shenyang 2019 F. Honk&#39;s pool
  5. Java多线程编程核心技术-第1章-Java多线程技能-读书笔记
  6. .Net反射-基础2-BindingFlags参数
  7. Github api【Restful接口规范】
  8. LeetCode 825. Friends Of Appropriate Ages
  9. OpenResty: PHP增加数据库插件
  10. 推荐:Markdown编辑软件 --- 小书匠