java實現生成二維碼

                                                     java實現生成二維碼java

二維碼vs條形碼        程序員

          最大的區別就是:二維碼具備容錯功能,當二維碼圖片被遮擋一部分後,仍能夠掃描出來。容錯的原理是二維碼在編碼過程當中進行了冗餘,就像是123被編碼成123123,這樣只要掃描到一部分二維碼圖片,二維碼內容仍是能夠被所有讀到。編程

          二維碼容錯率便是指二維碼圖標被遮擋多少後,仍能夠被掃描出來的能力。容錯率越高,則二維碼圖片能被遮擋的部分越多。數組

          二維碼容錯率用字母表示,容錯能力等級分爲:L、M、Q、H四級:測試

L       7%編碼

M     15%spa

Q      25%設計

H     30%code

      大多數狀況下,咱們強烈建議採用30%的容錯率。對此咱們作過各類型號手機的掃描測試。結果是:對目前主流手機,在絕大多數掃描場景下,容錯率越高,越容易被快速掃描!!!blog

若是須要對二維碼進行設計,好比須要在二維碼中間加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.畫完二維碼以後,畫筆和緩衝區圖片都要進行釋放。

 

運行結果:

相關文章
相關標籤/搜索