天天看点

Android使用zxing生成二维码,边框自定义宽度

1、基本方法

//二维码容错率,分四个等级:h、l 、m、 q

        errorcorrectionlevel level = errorcorrectionlevel.h;

        string qrname = "test.png"; //生成二维码图片名称

        string targetpath = servletactioncontext.getservletcontext().getrealpath("/");  //不解释

        file target = new file(targetpath, qrname);

        if(!target.exists()){

            target.mkdirs();

        }

//生成二维码中的设置

        hashtable hints = new hashtable();

        hints.put(encodehinttype.character_set, "utf-8"); //编码

        hints.put(encodehinttype.error_correction, level); //容错率

        hints.put(encodehinttype.margin, 0);  //二维码边框宽度,这里文档说设置0-4,但是设置后没有效果,不知原因,

        string content = “二维码内容”;

         int size = 200;  //二维码图片大小

        bitmatrix bitmatrix = new multiformatwriter().encode(content, barcodeformat.qr_code, size, size,hints); //生成bitmatrix

        int margin = 5;  //自定义白边边框宽度

        bitmatrix = updatebit(bitmatrix, margin);  //生成新的bitmatrix

        //因为二维码生成时,白边无法控制,去掉原有的白边,再添加自定义白边后,二维码大小与size大小就存在差异了,为了让新

生成的二维码大小还是size大小,根据size重新生成图片

        bufferedimage bi =  matrixtoimagewriter.tobufferedimage(bitmatrix);

        bi = zoominimage(bi,size,size);//根据size放大、缩小生成的二维码

        imageio.write(bi, "png", target); //生成二维码图片

这样生成的二维码在图片属性上跟我们设置的图片大小size是一致的。

唯一不明白的就是zxing库中生成二维码是设置白边边框不起作用,如果起作用,就不用这么麻烦了。

 2、调用的方法

因为二维码边框设置那里不起作用,不管设置多少,都会生成白边,所以根据网上的例子进行修改,自定义控制白边宽度,

该方法生成自定义白边框后的bitmatrix;

 private bitmatrix updatebit(bitmatrix matrix, int margin){

        int tempm = margin*2;

       int[] rec = matrix.getenclosingrectangle();   //获取二维码图案的属性

            int reswidth = rec[2] + tempm;

            int resheight = rec[3] + tempm;

            bitmatrix resmatrix = new bitmatrix(reswidth, resheight); // 按照自定义边框生成新的bitmatrix

            resmatrix.clear();

        for(int i= margin; i < reswidth- margin; i++){   //循环,将二维码图案绘制到新的bitmatrix中

            for(int j=margin; j < resheight-margin; j++){

                if(matrix.get(i-margin + rec[0], j-margin + rec[1])){

                    resmatrix.set(i,j);

                }

            }

         return resmatrix;

    }

  /**

     * 图片放大缩小

     */

    public static bufferedimage  zoominimage(bufferedimage  originalimage, int width, int height){

        bufferedimage newimage = new bufferedimage(width,height,originalimage.gettype());

        graphics g = newimage.getgraphics();

        g.drawimage(originalimage, 0,0,width,height,null);

        g.dispose();

        return newimage;

本人亲测,下面代码有效果,使用最新的jar包。

继续阅读