Qrcode生成二維碼的引數總結 及最小尺寸的測試

OuZeBo發表於2017-03-24

Qrcode生成二維碼,做過很多實驗,探索最小規格的二維碼到底是多少尺寸,和最高規格的二維碼到底是多大尺寸。現在我總結總結:

有兩種思路:

1.生成規格高的二維碼,然後壓縮到自己想要的尺寸的二維碼。這種:壓縮演算法不好的時候會很坑爹。

2.根據調整的引數生成原圖,這種圖是比較清晰的,列印出來都可以很好的被識別。

 

先說說第二種吧:根據測試,

1.不設定任何東西時:根據測試

   最小的二維碼尺寸是45——47:寬高(對於1---14個字元),

第二梯度:54-56:寬高(對於15--26字元)

第三梯度:61-63:寬高(對於27-43字元)

第四題都:。。。。。。。。。。。。。。。。。。

 

當我設定:setQrcodeVersion(0); 生成的二維碼尺寸隨儲存內容的變化而變化, 不會出現字串越界的錯誤。

根據測試:

第一梯度:

1.設定最低排錯率L,mode為A時:45-47:寬高(1-25個字元)

2.設定排錯率M時,mode為A時,只能存20位(純數字);

3.設定最低拍錯率L,mode為B,時:45-47:寬高(1-17個字元)

如果想儲存英文字元,絕對不能使用mode為A,必須使用mode為B

結論mode越大,字串儲存越小,排錯率越大,儲存字元越少     

第二梯度:

最優條件下 26------47個字元佔用大小是53-55的寬高;

對於常用的32位字元來說:最優配置是mode=A,排錯率=M;佔用53---55寬高,既能儲存32位字元,又能是排錯率更高,且尺寸是最極限。

第三梯度:

尺寸為62--64:最優配置能儲存1-78位字串。

 

當設定為1時:setQrcodeVersion(1); 如果超過所能儲存的長度,將會報錯,生成空白圖片。

在最優情況下:45---47尺寸能存25個字元,但是如果將排錯率改到最高H,那麼只能存10位

 

注意的一點:控制生成的二維碼大小跟 gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); 有關係;代表三釐米的二維碼,2代表2釐米的二維碼,1代表1釐米的二維碼。

總之:總結來說:
1.如果需要儲存英文的,那麼必須設定setQrcodeEncodeMode('B');
2.然後setQrcodeVersion(1);越大,那麼生成的碼儲存資訊越多,碼越亂。
3.然後可以設定gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);來控制生成二維碼的大小。   (只能控制大致範圍(最主要的控制),生成的大小還與設定setQrcodeVersion,setOrcodeEncodeMode,setQrcodeErrorCorrect有關.  根據這幾個的關係可以除錯出適合的二維碼。

4.如果啥都不設定的話,那麼同等情況下生成的二維碼尺寸會比設定為0時更大。

設定的程式碼:

public class BuilOr {
     private static BufferedImage qRCodeCommon(String content, String imgType, int size) {  
            BufferedImage bufImg = null;  
            size =10;  
            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 =178;  
                bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);  
                Graphics2D gs = bufImg.createGraphics();  
                // 設定背景顏色  
                gs.setBackground(Color.WHITE);  
                gs.clearRect(0, 0, imgSize, imgSize);  
      
                // 設定影象顏色> BLACK  
                gs.setColor(Color.BLACK);  
                // 設定偏移量,不設定可能導致解析出錯  
                int pixoff = 2;  
                // 輸出內容> 二維碼  
                if (contentBytes.length > 0 && contentBytes.length < 500) {  
      
                    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 * 2 + pixoff, i * 2 + pixoff, 2, 2);  
                            }  
                        }  
                    }  
                } 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;  
}

轉載於:http://m.blog.csdn.net/article/details?id=53511610

 

相關文章