天天看點

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包。

繼續閱讀