zoukankan      html  css  js  c++  java
  • 使用QRCODE生成二维码(JAVA)

    一、最近使用到了生成二维码的技术,特此记录

    本文介绍的是Denso的QRCODE。

    二、知识准备

    2.1、QRCODE基本属性简介

      1、符号规格  

      从版本1(21×21模块)到版本40(177×177 模块),每提高一个版本,每边增加4个模块。

      2、数据类型与容量(参照最大规格符号版本40-L级):

      数字数据:7,089个字符

      字母数据: 4,296个字符

      8位字节数据: 2,953个字符

      汉字数据:1,817个字符

      3、数据表示方法:

      深色模块表示二进制"1",浅色模块表示二进制"0"。

      4、纠错能力(同符号规格下,纠错能力越高,二维码容量越低):

      L级:约可纠错7%的数据码字

      M级:约可纠错15%的数据码字

      Q级:约可纠错25%的数据码字

      H级:约可纠错30%的数据码字

    2.2、maven依赖

    <dependency>
    <groupId>qrcode</groupId>
    <artifactId>qrcode</artifactId>
    <version>1.0</version>
    </dependency>

    三、生成二维码BufferedImage对象

    /**
         * @Description: 生成BufferedImage对象
         * @param content
         *            二维码存放的信息
         * @param errorCorrect
         *            容错级别 
         *            表示的字符串长度: 容错率(ECC) 显示编码模式(EncodeMode)及版本(Version)有关二维码的纠错级别(排错率),
         *            共有四级:可选L(7%)、M(15%)、Q(25%)、H(30%)(最高H)。
         *            纠错信息同样存储在二维码中,纠错级别越高,纠错信息占用的空间越多,那么能存储的有用信息就越少, 
         *            对二维码清晰度的要求越小
         * @param mode
         *            编码模式 编码模式:Numeric 数字, Alphanumeric 英文字母,Binary 二进制,Kanji
         *            汉字(第一个大写字母表示)
         * @param version
         *            二维码的版本号 二维码的版本号:也象征着二维码的信息容量;二维码可以看成一个黑白方格矩阵,版本不同,
         *            矩阵长宽方向方格的总数量分别不同。 1-40总共40个版本,版本1为21*21矩阵,版本每增1,二维码的两个边长都增4;
         *            版本2 为25x25模块,最高版本为是40,是177*177的矩阵;
         * @return
         * @throws IOException
         */
        public static BufferedImage createQrcode(String content, char errorCorrect,
                char mode, int version) throws IOException {
            BufferedImage image =null;
            if (null == content || "".equals(content)) {
    
            } else {
                Qrcode qrcode = new Qrcode();
                qrcode.setQrcodeErrorCorrect(errorCorrect);
                qrcode.setQrcodeEncodeMode(mode);
                
                qrcode.setQrcodeVersion(version);
                // 获取内容的字节数组,设置编码格式
                byte[] bytes = content.getBytes("UTF-8");
                // 图片尺寸,会根据version的变大,而变大,自己需要计算
                int imgSize =  67 + 12 * (version - 1);
                image = new BufferedImage(imgSize, imgSize,
                                BufferedImage.TYPE_BYTE_BINARY);
                // 获取画笔
                Graphics2D gs = image.createGraphics();
                // 设置背景色 白色
                gs.setBackground(Color.WHITE);
                gs.clearRect(0, 0, imgSize, imgSize);
                // 设定图像颜色 黑色
                gs.setColor(Color.BLACK);
                // 设置偏移量,不设置可能导致二维码生产错误(解析失败出错)
                int pixoff = 2;
                // 二维码输出
                if (bytes.length > 0 && bytes.length < 120) {
                    boolean[][] s = qrcode.calQrcode(bytes);
                    for (int i = 0; i < s.length; i++) {
                        for (int j = 0; j < s.length; j++) {
                            if (s[j][i]) {
                                //注意j * 3 + pixoff, i * 3 + pixoff, 3, 3中的pixoff和3也会影响二维码像素,但是影响并不会很大,
                                //二维码像素主要受version影响
                                gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);//填充矩形区域
                            }
                        }
                    }
                }
                gs.dispose();
                image.flush();
            }
            return image;
        }

    四、生成二维码图片

        /** 
         * 二维码输出到文件 
         *  @param image 二维码内容 
         * @param format 图片格式 例如jpg、gif等
         * @param file 输出文件 
         * @return 
         * */  
        public static File writeToFile(BufferedImage image,String format,File file) throws IOException{  
            if(null == file){
                file = new File("E:"+File.separator+"xxx.xxx");//自己的默认存储路径
            }
                ImageIO.write(image, format, file);
             return file;
        }  

    五、转换成流

    如果需要上传到图片服务器,需要将BufferedImage转换成流形式

       /**
     * @Description: 转换BufferedImage->输出流  
     * @param image 二维码内容
     * @param format 图片格式 例如jpg、gif等
     * @param outPutStream 输出流
     * @return
     * @throws IOException
     */
    public static OutputStream writeToStream(BufferedImage image,String format,OutputStream outPutStream) throws IOException{
           if(null == outPutStream){
               outPutStream = new ByteArrayOutputStream();
           }
           ImageIO.write(image,format, outPutStream);
           return outPutStream;
       }
  • 相关阅读:
    Java变量在内存中的存储
    Java成员变量和局部变量
    Java类的定义与类的实例化
    面向对象编程思想
    Java数组深入
    Java的Arrays类 基本用法
    Intellij IDEA如何设置快速调整字体大小的快捷键
    Win10如何快速截屏
    应用层协议原理(二)
    应用层协议原理(一)
  • 原文地址:https://www.cnblogs.com/lige-H/p/8297153.html
Copyright © 2011-2022 走看看