java實現生成二維碼
java實現生成二維碼
二維碼vs條形碼
最大的區別就是:二維碼具有容錯功能,當二維碼圖片被遮擋一部分後,仍可以掃描出來。容錯的原理是二維碼在編碼過程中進行了冗余,就像是123被編碼成123123,這樣只要掃描到一部分二維碼圖片,二維碼內容還是可以被全部讀到。
二維碼容錯率即是指二維碼圖標被遮擋多少後,仍可以被掃描出來的能力。容錯率越高,則二維碼圖片能被遮擋的部分越多。
二維碼容錯率用字母表示,容錯能力等級分為:L、M、Q、H四級:
L 7%
M 15%
Q 25%
H 30%
大多數情況下,我們強烈建議采用30%的容錯率。對此我們做過各種型號手機的掃描測試。結果是:對目前主流手機,在絕大多數掃描場景下,容錯率越高,越容易被快速掃描!!!
如果需要對二維碼進行設計,比如需要在二維碼中間加logo則需要選擇H級容錯率的二維碼。當然,高容錯率的代價是圖片的復雜度提高。在實際操作中應該根據需求選擇相應的容錯級別。
註意,二維碼邊上的三個定位框和中間定位小塊不能被遮擋。否則容錯率再高也無法掃描。
所以超市當超市裏面的商品上的條形碼發生損壞事件時,是不能被掃描出來的,需要龔工作人員將條形碼的號碼輸入電腦才可以計算價格。
實現二維碼的思路:
1.首先引入兩個包,qrcode_a.rar和qrcode_b.rar兩個包,這兩個包中已經實現了創建二維碼,計算二維碼的許多方法,只需要應用過來用就可以了,非常方便。
2.創建一個緩沖區圖片;
3.從緩沖區圖片的基礎上創建畫筆;
4.g.clearRect(0, 0, width, height);清空畫面,準備畫二維碼;
5.設置二維碼最後實現的信息;
6.將要實現的信息轉化為字節數組;
7.用boolean類型的二維數組存放二維碼,如果是true則描黑,false則留白;
代碼實現:
package QRcode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import javax.imageio.ImageIO; import com.swetake.util.Qrcode; public class CreatQrCode { /* * 生成二維碼 */ public static void main(String[] args) throws UnsupportedEncodingException { Qrcode qrcode=new Qrcode(); //設置糾錯等級 qrcode.setQrcodeErrorCorrect(‘m‘); qrcode.setQrcodeEncodeMode(‘B‘);//N 數字 A a-z B 中文,日文等等 qrcode.setQrcodeVersion(10);//版本號1-40 /* * GUI編程 */ //版本號與圖片的長和寬是有聯系的:這是一個固定的公式 int width=67+12*(10-1); int height=67+12*(10-1); //設置偏移量,糾正二維碼在解析時的錯誤 int pianyiliang=2; //緩沖區圖片 BufferedImage buffimmage=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //在緩沖區圖片的基礎上創造畫筆 Graphics2D g=buffimmage.createGraphics(); g.setBackground(Color.WHITE); g.setColor(Color.BLACK); g.clearRect(0, 0, width, height); //開始畫二維碼 /* * 設置二維碼信息 */ String str="http://47.93.198.182";//這是一個程序員的表白網頁 //把字符串轉化為字節數組 byte[] bytes=str.getBytes("utf-8"); if(bytes.length>0){ //用boolean類型的二維數組存放二維碼,如果是true則描黑,false則留白。qrcode.calQrcode(bytes);是計算二維碼的信息的是方法 boolean[][] bool=qrcode.calQrcode(bytes); //長和寬是一樣的 for(int i=0;i<bool.length;i++){ for(int j=0;j<bool[i].length;j++){ if(bool[i][j]==true){ //畫小方格 g.fillRect(i*3+pianyiliang, j*3+pianyiliang, 3, 3); } } } } g.dispose(); buffimmage.flush(); //ctrl 1:提示錯誤的快捷鍵 try { ImageIO.write(buffimmage, "png", new File("d://a1.png")); } catch (IOException e) { e.printStackTrace(); } } }
註意的事項:
1.二維碼的版本號與圖片的長和寬是有聯系的,這裏有一個固定的公式:67+12*(版本號-1);
2.在畫小方格的時候,為了糾正二維碼在解析時的錯誤,需要設置一定的額偏移量,g.fillRect(i*3+pianyiliang, j*3+pianyiliang, 3, 3);
3.畫完二維碼之後,畫筆和緩沖區圖片都要進行釋放。
運行結果:
java實現生成二維碼