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