二維碼的原理以及怎麼生成二維碼

一、什麼是二維碼:

二維碼 (2-dimensional bar code),是用某種特定的幾何圖形按一定規律在平面(二維方向上)
分佈的黑白相間的圖形記錄數據符號信息的。

二、常用的碼制

Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等。

三、爲什麼叫二維碼

二維碼的名稱是相對與一維碼來說的:

比如以前的條形碼,只有橫向的豎條狀信息,所以也叫“一維碼”。

二維碼呢,則是橫向縱向都有信息,所有叫“二維碼”。

二維碼優點有:

存儲的數據量更大;可以包含數字、字符,及中文文本等混合內容;有一定的容錯性(在部分損壞以後可以正常讀取);空間利用率高等。

二維碼中,最流行莫過於QR CODE。

四、二維碼爲什麼是黑白相間的?

因爲黑色表示二進制的“1”,白色表示二進制的“0”。

我們之所以對二維碼進行掃描能讀出那麼多信息,就是因爲這些信息被編入了二維碼之中。

製作二維碼輸入的信息可以分成三類:

​ 文本信息,比如名片信息;

​ 字符信息,比如網址、電話號碼;

​ 圖片信息,甚至還可以包括簡短的視頻。

數據信息是怎麼被編入的呢?

信息輸入後,首先要選擇一種信息編碼的碼制。現在常見的二維碼都是以QR碼作爲編碼的碼制。QR碼是矩陣式二維碼,它是在一個矩形空間內,通過黑、白像素在矩陣中的不同分佈,來進行編碼的。我們知道電腦使用二進制(0和1)數來貯存和處理數據,而在二維碼中,用黑白矩形表示二進制數據我們肉眼能看到的黑色表示的是二進制“1”,白色表示二進制的“0”,黑白的排列組合確定了矩陣式二維條碼的內容,以便於計算機對二維碼符號進行編碼和分析。

五、QR CODE 介紹

QR(Quick-Response) code是被廣泛使用的一種二維碼,解碼速度快。它可以存儲多用類型
在這裏插入圖片描述
如上圖時一個qrcode的基本結構,其中:
位置探測圖形、位置探測圖形分隔符、定位圖形:用於對二維碼的定位,對每個QR碼來說,位置都是固定存在的,只是大小規格會有所差異;
校正圖形:規格確定,校正圖形的數量和位置也就確定了;
格式信息:表示改二維碼的糾錯級別,分爲L、M、Q、H;
版本信息:即二維碼的規格,QR碼符號共有40種規格的矩陣(一般爲黑白色),從21×21(版本1),到177×177(版本40),每一版本符號比前一版本 每邊增加4個模塊。
數據和糾錯碼字:實際保存的二維碼信息,和糾錯碼字(用於修正二維碼損壞帶來的錯誤)。
簡要的編碼過程:

  1. 數據分析:確定編碼的字符類型,按相應的字符集轉換成符號字符; 選擇糾錯等級,在規格一定的條件下,糾錯等級越高其真實數據的容量越小。
  2. 數據編碼:將數據字符轉換爲位流,每8位一個碼字,整體構成一個數據的碼字序列。其實知道這個數據碼字序列就知道了二維碼的數據內容。
    在這裏插入圖片描述

QR碼可以從任意方向讀取:

QR碼從360°任一方向均可快速讀取。其奧祕就在於QR碼中的3處定位圖案,可以幫助QR碼不受背景樣式的影響,實現快速穩定的讀取。
在這裏插入圖片描述

提示:

QR碼是日本產的二維碼,因此非常適合處理日文字母和漢字。QR碼字集規格定義是按照日本標準“JIS第一級和第二級的漢字”制定的,因此在日語處理方面,每一個全角字母和漢字都用13比特的數據處理,效率較高,與其他二維碼相比,可以多存儲20%以上的信息。

六、QR碼糾錯功能

QR碼具有“糾錯功能”。即使編碼變髒或破損,也可自動恢復數據。這一“糾錯能力”具備4個級別,用戶可根據使用環境選擇相應的級別。調高級別,糾錯能力也相應提高,但由於數據量會隨之增加(對應二維碼裏包含的錯誤校驗信息增加),編碼尺寸也也會變大,圖形也會變密。
用戶應綜合考慮使用環境、編碼尺寸等因素後選擇相應的級別。 在工廠等容易沾染贓物的環境下,可以選擇級別Q或H,在不那麼髒的環境下,且數據量較多的時候,也可以選擇級別L。一般情況下用戶大多選擇級別M(15%)。
在這裏插入圖片描述
那是怎麼修正錯誤呢?

比如我要存一百個數字,那可以額外加一個這一百個數字的和,如果有一個數字缺失,那根據這個和求出,這個就是百分之一的可被修正。如果想兩個缺失能被複原就需要再加一些參數。所以信息量就增加了,對應圖形就越來越密了。

七、QR碼的信息量和版本

QR碼設有1到40的不同版本,每個版本都具備固有的碼元結構(碼元數)。
碼元是指構成QR碼的方形黑白點。
碼元結構是指二維碼中的碼元數。從版本1(21碼元×21碼元)開始,在縱向和橫向各自以4碼元爲單位遞增,一直到版本40(177碼元×177碼元)。
在這裏插入圖片描述
QR碼的各個版本結合數據量、字符類型和糾錯級別,均設有相對應的最多輸入字符數。也就是說,如果增加數據量,則需要使用更多的碼元來組成QR碼,QR碼就會變得更大,更密。

八、具體實現

PHP QR Code文檔地址
PHP QR Code下載地址

// 通過引用PHP QR Code類庫,最簡單的調用方式
// 必須開啓支持GD2擴展庫支持
include "qrlib.php";
$PNG_WEB_DIR = 'temp/';
// 設置二維碼圖片緩存路徑
$PNG_TEMP_DIR = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'temp' . DIRECTORY_SEPARATOR;
// 如果二維碼圖片緩存路徑不存在,則需要重新創建
if (!file_exists($PNG_TEMP_DIR)) {
    mkdir($PNG_TEMP_DIR, 0777);
}
$filename = $PNG_TEMP_DIR . 'test.png';
// 設置二維碼圖片糾錯級別
$errorCorrectionLevel = 'L';
if (isset($_REQUEST['level']) && in_array($_REQUEST['level'], array('L', 'M', 'Q', 'H'))) {
    $errorCorrectionLevel = $_REQUEST['level'];
}
$filename = $PNG_TEMP_DIR . 'test' . md5($_REQUEST['data'] . '|' . $errorCorrectionLevel . '|' . $matrixPointSize) . '.png';
    QRcode::png($_REQUEST['data'], $filename, $errorCorrectionLevel, $matrixPointSize, 10);
echo '<img src="' . $PNG_WEB_DIR . basename($filename) . '" /><hr/>';
// 設置二維碼圖片大小
$matrixPointSize = 4;
if (isset($_REQUEST['size'])) {
    $matrixPointSize = min(max((int) $_REQUEST['size'], 1), 10); // 做一個限制大小,最小爲1,最大爲10
}

// 基準測試;生成耗時等
QRtools::timeBenchmark();

// 參數$text表示生成二位的的信息文本;
// 參數$outfile表示是否輸出二維碼圖片文件,默認否;
// 參數$level表示容錯率;分別是L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%);
// 參數$size表示生成圖片大小,默認是3// 參數$margin表示二維碼周圍邊框空白區域間距值;
// 參數$saveandprint表示是否保存二維碼並顯示
QRcode::png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)

QR Code 其它示例

參考文章1
參考文章2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章