• java实现二维码的生成和解读


    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("=========解码成功==========="); 
        
  • 相关阅读:
    .NET开发人员遇到Maven
    基于VS Code创建Java command-line app
    IntelliJ IDEA连接TFS local workspace无法正常签入
    Xcode连接TFS Git用户名和密码不正确解决方案
    Fiddler如何捕捉DefaultHttpClient的HTTP请求
    IIS 6的日志time-taken字段没有值的解决方案
    简单的音乐轮播JS
    SpringCloud分布式开发理解
    SpringCloud分布式开发五大神兽
    socket长连接和短链接区别
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/11419798.html
Copyright © 2020-2023  润新知