1. 程式人生 > 其它 >二維碼的生成細節和原理

二維碼的生成細節和原理

基礎知識參考http://news.cnblogs.com/n/191671/

二維碼又稱 QR Code,QR 全稱 Quick Response,是一個近幾年來移動裝置上超流行的一種編碼方式,它比傳統的 Bar Code 條形碼能存更多的資訊,也能表示更多的資料型別:

比如:字元,數字,日文,中文等等。這兩天學習了一下二維碼圖片生成的相關細節,覺得這個玩意就是一個密碼演算法,

基礎知識

  首先,我們先說一下二維碼一共有 40 個尺寸。官方叫版本 Version。Version 1 是 21 x 21 的矩陣,Version 2 是 25 x 25 的矩陣,Version 3 是 29 的尺寸,每增加一個 version,就會增加 4 的尺寸,公式是:(V-1)*4 + 21(V是版本號) 最高 Version 40,(40-1)*4+21 = 177,所以最高是 177 x 177 的正方形。

PHP實現生成二維碼(可運用於推廣,分銷業務等)

方法一:用PHP二維碼生成類庫QRcode,很好用,簡單快捷!

qrcocde下載

二維碼是一個近幾年來移動裝置上超流行的一種編碼方式,最早出現在20世紀20年代,到1988年才引入中國。現在,日常生活中更是隨處可見。它比傳統的Bar Code條形碼能存更多的資訊,也能表示更多的資料型別。它具有條碼技術的一些共性:每種碼制有其特定的字符集;每個字元佔有一定的寬度;具有一定的校驗功能等。同時還具有對不同行的資訊自動識別功能、及處理圖形旋轉變化點。下面通過一些小案例,不靠第三方平臺,輕鬆製作自己的二維碼圖片

QRCode
QR Code碼,是由Denso公司於1994年9月研製的一種矩陣二維碼符號,它具有一維條碼及其它二維條碼所具有的資訊容量大、可靠性高、可表示漢字及圖象多種文字資訊、保密防偽性強等優點。
超高速
從QR Code碼的英文名稱Quick Response Code可以看出,超高速識讀特點是QR Code碼區別於四一七條碼、Data Matrix等二維碼的主要特性。由於在用CCD識讀QR Code碼時,整個QR Code碼符號中資訊的讀取是通過QR Code碼符號的位置探測圖形,用硬體來實現,因此,資訊識讀過程所需時間很短,它具有超高速識讀特點。用CCD二維條碼識讀裝置,每秒可識讀30個含有100個字元的QR Code碼符號;對於含有相同資料資訊的四一七條碼符號,每秒僅能識讀3個符號;對於Data Matrix矩陣碼,每秒僅能識讀2~3個符號。QR Code碼的超高速識讀特性使它能夠廣泛應用於工業自動化生產線管理等領域。
全方位
QR Code碼具有全方位(360°)識讀特點,這是QR Code碼優於行排式二維條碼如四一七條碼的另一主要特點,由於四一七條碼是將一維條碼符號在行排高度上的截短來實現的,因此,,它很難實現全方位識讀,其識讀方位角僅為±10°。
能夠有效地表示漢字
由於QR Code碼用特定的資料壓縮模式表示漢字,它僅用13bit可表示一個漢字,而四一七條碼、Data Matrix等二維碼沒有特定的漢字表示模式,因此僅用位元組表示模式來表示漢字,在用位元組模式表示漢字時,需用16bit(二個位元組)表示一個漢字,因此QR Code碼比其它的二維條碼錶示漢字的效率提高了20%。
引數$level表示容錯率,也就是有被覆蓋的區域還能識別。它有四個級別,分別是 L, H, M, Q
QR_ECLEVEL_L,    最大 7% 的錯誤能夠被糾正;
QR_ECLEVEL_M,  最大 15% 的錯誤能夠被糾正;
QR_ECLEVEL_Q,   最大 25% 的錯誤能夠被糾正;
QR_ECLEVEL_H,   最大 30% 的錯誤能夠被糾正;

實現程式碼:

帶logo

include 'phpqrcode.php';
$value = 'http://www.cnblogs.com/itzhangxuhui'; //二維碼內容
$errorCorrectionLevel = 'L';//容錯級別
$matrixPointSize = 6;//生成圖片大小
QRcode::png($value, 'qrcode.png', $errorCorrectionLevel, $matrixPointSize, 2);
//生成二維碼圖片
$logo = 'logo.jpg';//準備好的logo圖片
$QR = 'qrcode.png';//已經生成的原始二維碼圖

if ($logo !== FALSE) {
    $QR = imagecreatefromstring(file_get_contents($QR));
    $logo = imagecreatefromstring(file_get_contents($logo));
    $QR_width = imagesx($QR);//二維碼圖片寬度
    $QR_height = imagesy($QR);//二維碼圖片高度
    $logo_width = imagesx($logo);//logo圖片寬度
    $logo_height = imagesy($logo);//logo圖片高度
    $logo_qr_width = $QR_width / 5;
    $scale = $logo_width/$logo_qr_width;
    $logo_qr_height = $logo_height/$scale;
    $from_width = ($QR_width - $logo_qr_width) / 2;
    //重新組合圖片並調整大小
    imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,
        $logo_qr_height, $logo_width, $logo_height);
}
//輸出圖片
imagepng($QR,'phpmaster.png');

無需logo

//引入核心庫檔案
include "phpqrcode/phpqrcode.php";
//定義糾錯級別
$errorLevel = "L";
 //定義生成圖片寬度和高度;預設為3
$size = "4";
//定義生成內容
// $content="嘗試一下內容測試";
//呼叫QRcode類的靜態方法png生成二維碼圖片//
// QRcode::png($content, false, $errorLevel, $size);
//生成網址型別
$url="http://www.lpcblog.com/";
QRcode::png($url, false, $errorLevel, $size);