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