1. 程式人生 > >二維碼的生成與解析示例 生成二維碼

二維碼的生成與解析示例 生成二維碼

二維碼,是一種採用黑白相間的平面幾何圖形通過相應的編碼演算法來記錄文字、圖片、網址等資訊的條碼圖片。如下圖

二維碼的特點:

1.  高密度編碼,資訊容量大

可容納多達1850個大寫字母或2710個數字或1108個位元組,或500多個漢字,比普通條碼資訊容量約高几十倍。

2.  編碼範圍廣

該條碼可以把圖片、聲音、文字、簽字、指紋等可以數字化的資訊進行編碼,用條碼錶示出來;可以表示多種語言文字;可表示影象資料。

3.  容錯能力強,具有糾錯功能

這使得二維條碼因穿孔、汙損等引起區域性損壞時,照樣可以正確得到識讀,損毀面積達50%仍可恢復資訊。

4.  譯碼可靠性高

它比普通條碼譯碼錯誤率百萬分之二要低得多,誤位元速率不超過千萬分之一。

5.  可引入加密措施

保密性、防偽性好。

6.  成本低,易製作,持久耐用

正因為以上這些特點,二維碼現在越來越流行,應用也是越來越廣(詳細瞭解請見百度百科,介紹不是本篇重點),所以掌握如何開發二維碼是非常不錯的知識儲備,因此本篇博文將為大家講解如何生成、解析二維碼。

一、Java

所需jar包: QRCode.jar

TwoDimensionCode類:二維碼操作核心類

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.InputStream;  
import java.io.OutputStream;  
  
import javax.imageio.ImageIO;  
  
import jp.sourceforge.qrcode.QRCodeDecoder;  
import jp.sourceforge.qrcode.exception.DecodingFailedException;  
  
import com.swetake.util.Qrcode;  
  
public class TwoDimensionCode {  
      
    /** 
     * 生成二維碼(QRCode)圖片 
     * @param content 儲存內容 
     * @param imgPath 圖片路徑 
     */  
    public void encoderQRCode(String content, String imgPath) {  
        this.encoderQRCode(content, imgPath, "png", 7);  
    }  
      
    /** 
     * 生成二維碼(QRCode)圖片 
     * @param content 儲存內容 
     * @param output 輸出流 
     */  
    public void encoderQRCode(String content, OutputStream output) {  
        this.encoderQRCode(content, output, "png", 7);  
    }  
      
    /** 
     * 生成二維碼(QRCode)圖片 
     * @param content 儲存內容 
     * @param imgPath 圖片路徑 
     * @param imgType 圖片型別 
     */  
    public void encoderQRCode(String content, String imgPath, String imgType) {  
        this.encoderQRCode(content, imgPath, imgType, 7);  
    }  
      
    /** 
     * 生成二維碼(QRCode)圖片 
     * @param content 儲存內容 
     * @param output 輸出流 
     * @param imgType 圖片型別 
     */  
    public void encoderQRCode(String content, OutputStream output, String imgType) {  
        this.encoderQRCode(content, output, imgType, 7);  
    }  
  
    /** 
     * 生成二維碼(QRCode)圖片 
     * @param content 儲存內容 
     * @param imgPath 圖片路徑 
     * @param imgType 圖片型別 
     * @param size 二維碼尺寸 
     */  
    public void encoderQRCode(String content, String imgPath, String imgType, int size) {  
        try {  
            BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);  
              
            File imgFile = new File(imgPath);  
            // 生成二維碼QRCode圖片   
            ImageIO.write(bufImg, imgType, imgFile);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
    /** 
     * 生成二維碼(QRCode)圖片 
     * @param content 儲存內容 
     * @param output 輸出流 
     * @param imgType 圖片型別 
     * @param size 二維碼尺寸 
     */  
    public void encoderQRCode(String content, OutputStream output, String imgType, int size) {  
        try {  
            BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);  
            // 生成二維碼QRCode圖片   
            ImageIO.write(bufImg, imgType, output);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
      
    /** 
     * 生成二維碼(QRCode)圖片的公共方法 
     * @param content 儲存內容 
     * @param imgType 圖片型別 
     * @param size 二維碼尺寸 
     * @return 
     */  
    private BufferedImage qRCodeCommon(String content, String imgType, int size) {  
        BufferedImage bufImg = null;  
        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 = 67 + 12 * (size - 1);  
            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 < 800) {  
                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 * 3 + pixoff, i * 3 + pixoff, 3, 3);  
                        }  
                    }  
                }  
            } 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;  
    }  
      
    /** 
     * 解析二維碼(QRCode) 
     * @param imgPath 圖片路徑 
     * @return 
     */  
    public String decoderQRCode(String imgPath) {  
        // QRCode 二維碼圖片的檔案   
        File imageFile = new File(imgPath);  
        BufferedImage bufImg = null;  
        String content = null;  
        try {  
            bufImg = ImageIO.read(imageFile);  
            QRCodeDecoder decoder = new QRCodeDecoder();  
            content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");   
        } catch (IOException e) {  
            System.out.println("Error: " + e.getMessage());  
            e.printStackTrace();  
        } catch (DecodingFailedException dfe) {  
            System.out.println("Error: " + dfe.getMessage());  
            dfe.printStackTrace();  
        }  
        return content;  
    }  
      
    /** 
     * 解析二維碼(QRCode) 
     * @param input 輸入流 
     * @return 
     */  
    public String decoderQRCode(InputStream input) {  
        BufferedImage bufImg = null;  
        String content = null;  
        try {  
            bufImg = ImageIO.read(input);  
            QRCodeDecoder decoder = new QRCodeDecoder();  
            content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");   
        } catch (IOException e) {  
            System.out.println("Error: " + e.getMessage());  
            e.printStackTrace();  
        } catch (DecodingFailedException dfe) {  
            System.out.println("Error: " + dfe.getMessage());  
            dfe.printStackTrace();  
        }  
        return content;  
    }  
  
    public static void main(String[] args) {  
        String imgPath = "G:/TDDOWNLOAD/Michael_QRCode.png";  
        String encoderContent = "Hello 大大、小小,welcome to QRCode!" + "\nMyblog [ http://sjsky.iteye.com ]" + "\nEMail [ 
[email protected]
]"; TwoDimensionCode handler = new TwoDimensionCode(); handler.encoderQRCode(encoderContent, imgPath, "png"); System.out.println("========encoder success"); String decoderContent = handler.decoderQRCode(imgPath); System.out.println("解析結果如下:"); System.out.println(decoderContent); System.out.println("========decoder success!!!"); } }

TwoDimensionCodeImage 類:二維碼圖片物件

package qrcode;  
  
import java.awt.image.BufferedImage;  
  
import jp.sourceforge.qrcode.data.QRCodeImage;  
  
public class TwoDimensionCodeImage implements QRCodeImage {  
  
    BufferedImage bufImg;  
      
    public TwoDimensionCodeImage(BufferedImage bufImg) {  
        this.bufImg = bufImg;  
    }  
      
    @Override  
    public int getHeight() {  
        return bufImg.getHeight();  
    }  
  
    @Override  
    public int getPixel(int x, int y) {  
        return bufImg.getRGB(x, y);  
    }  
  
    @Override  
    public int getWidth() {  
        return bufImg.getWidth();  
    }  
}  
OK,這樣就能成功地生成、解析二維碼了。

相關推薦

生成解析示例 生成

二維碼,是一種採用黑白相間的平面幾何圖形通過相應的編碼演算法來記錄文字、圖片、網址等資訊的條碼圖片。如下圖 二維碼的特點: 1.  高密度編碼,資訊容量大 可容納多達1850個大寫字母或2710個數字或1108個位元組,或500多個漢字,比普通條碼資訊容量約高几十倍。

Java_util_02_生成解析

isp tar org img 工具 bsp nan tab htm 1.引入jar包 zxing-core-1.7.jar : http://viralpatel.net/blogs/download/jar/zxing-core-1.7.jar zxing

Java 使用QRCode.jar生成解析

宣告:部分程式碼來自慕課網!!! https://files.cnblogs.com/files/bigroc/QRCode.zip 也可以自己下載壓縮包: 1、生成(中文網站打不開,建議開啟英文(en)網站):http://www.swetake.com/qrcode/index-

java生成解析

 1.引入依賴 <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</a

你不可錯過的生成解析-java後臺前端js都有

1.二維碼分類   二維條碼也有許多不同的碼制,就碼制的編碼原理而言,通常分為三種類型。 線性堆疊式二維碼 編碼原理: 建立在一維條碼基礎之上,按需要堆積成兩行或多行。 圖示: 矩陣式二維碼 最常用編碼,原理: 在一個矩形空間通過黑白畫素在矩陣中的不同分佈進行編碼。在

XQRCode 一個非常方便實用的掃描、解析生成

XQRCode 一個非常方便實用的二維碼掃描、解析、生成庫 關於我 特點 支援快速整合條形碼、二維碼掃描功能。 支援自定義掃描介面。 支援生成帶圖示的二維碼。 支援生成帶背景圖片的複雜二維碼。 支援二維碼解析功能 1、

JSON數據的生成解析

turn sco 個數 學生 jar包 網上 get main gets JSON數據的生成與解析。首先先到網上下載一個json jar包,我用的是org.json 演示樣例代碼: package json; import org.json.JSONA

Android中XML文件的序列化生成解析

eval test director 南海 attribute trac cli found dir 首先,我把Person的實體類 package net.loonggg.test; public class Person { privat

c語言cJson數組生成解析

scu 長度 c語言 數組 != res bject urn dds 1.生成 json char* CreatJsCustNo( BT_BNF_CUST *p, char *strPaperNO) { cJSON *pJsonArry,*pJsonsub;

iOS開發之JSON格式數據的生成解析

添加 json intern 對象 RM use convert mail value 我們為什麽要用JSON格式的數據? JSON格式取代了xml給網絡傳輸帶來了很大的便利,但是卻沒有了xml的一目了然,尤其是json數據很長的時候,我們會陷入繁瑣復雜的數據節點查找中。

android中常用的xml生成解析

總結了一下解析XML的三種方式。下圖為要解析的XML的格式。 解析了兩種方式的XML,一種是檔案,另一種是流。 程式碼中用到的許多的類是我虛構出來的,例如在第二種解析中用到的User類。使用者應該先寫這個類,寫出他們的屬性,並寫get和set方法才可以的。 <?xml

關於Qt中QJsonObject、QJsonArray生成解析JSON檔案

使用QJsonArray寫檔案:   QString fileName = ":load.json";     QFile srcFile(fileName);     if(!srcFile.open(QFile::ReadWrite)){ &

OFDM符號的生成解析

1 OFDM訊號的生成 04.06  指由資訊生成OFDM訊號再由OFDM訊號還原資訊的過程,指示編寫matlab程式碼的大體過程如下圖所示。 Figure 1. OFDM訊號的生成與解析 04.07  依據筆記[3],可易得到在matlab中OFDM訊號生成的程式

Android學習記錄(1)—Android中XML檔案的序列化生成解析

xml檔案是非常常用的,在android中json和xml是非常常用的兩種封裝資料的形式,從伺服器中獲取資料也經常是這兩種形式的,所以學會生成和解析xml和json是非常有用的,json相對來說是比較簡單的,咱不做介紹了,這裡給大家講一下xml的序列化生成和解析。不廢話了,

json生成解析例項

重點類:JsonWriter,JsonRead,JSONObject,JSONTokener,JSONArray. 流程: 1. 首先在MainActivity.java類中的四個按鈕對應的是 前面兩個是利用JsonParserUtil.java這個類來生成或者解析j

JSON解析類庫之Fastjson(1) --- Fastjson類庫學習, 生成解析json資料,json字串Java物件互轉

JSON解析類庫之Fastjson(1) --- Fastjson基礎知識、簡單JavaBean與複雜Bean物件與JSON互轉 -- Fastjson類庫學習, 生成與解析json資料,json

tinyxml(三)——簡單的生成解析示例

#include <stdio.h> #include <string> using namespace std; #include "../tinyxml/tinyxml.

XML生成解析(DOM、ElementTree)

xml.dom篇     DOM是Document Object Model的簡稱,XML 文件的高階樹型表示。該模型並非只針對 Python,而是一種普通XML 模型。Python 的 DOM 包是基於 SAX 構建的,並且包括在 Python 2.0 的標準 XML 支援裡。 一、xml.dom的簡單

CXF客戶端程式碼生成服務呼叫(

通過命令列操作: C:\Documents and Settings\hsy C:\Documents and Settings\hsy>f: F:\>dir 驅動器 F 中的卷是 ProData 卷的序列號是 5C5E-6EE2 F:\ 的目錄 ...

android下基本json串的生成解析

以前就用過json串,不過是在java環境下面,如今轉移到android環境下,java裡面生成解析json串的jar包與android中自帶的衝突,所以也只能用安卓自帶的。 先前查網上的資料,感覺很多都說的很亂,直接給出了例子,也不解釋一下就算完成,他們自己肯定是明白的,