1. 程式人生 > >java實現生成二維碼

java實現生成二維碼

ron isp -a 數組 技術分享 rar cep 代碼實現 lac

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實現生成二維碼