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


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM