使用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;
   }

 

posted @ 2018-01-16 16:05  薏米仁儿  阅读(5069)  评论(0编辑  收藏  举报