闡述二維碼的原理以及使用google api和PHP QR Code來生成二維碼

1、什麼是二維碼:
二維碼 (2-dimensional bar code),是用某種特定的幾何圖形按必定規律在平面(二維方向上)
分佈的黑白相間的圖形記錄數據符號信息的。
在許多種類的二維條碼中,經常使用的碼制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等。
    1.堆疊式/行排式二維條碼,如,Code 16K、Code 4九、PDF417(以下圖)等
    2.矩陣式二維碼,最流行莫過於QR CODE ,咱們常說的二維碼就是它了。
二維碼的名稱是相對與一維碼來講的,好比之前的條形碼就是一個「一維碼」,
它的優勢有:二維碼存儲的數據量更大;能夠包含數字、字符,及中文文本等混合內容;有必定的容錯性,二維碼的容錯率後面會介紹,這個很重要,通常的二維碼你遮住部分任然可以解碼,這是由於生成器會將部分信息重複表示(也就是冗餘)來提升其容錯度,因此你看到不少二維碼中間還帶了logo;空間利用率高等。
矩陣式二維碼
2、QR CODE 介紹
QR(Quick-Response) code是被普遍使用的一種二維碼,解碼速度快。它能夠存儲多用類型
QR code
如上圖時一個qrcode的基本結構,其中:
位置探測圖形、位置探測圖形分隔符、定位圖形:用於對二維碼的定位,對每一個QR碼來講,位置都是固定存在的,只是大小規格會有所差別;
校訂圖形:規格肯定,校訂圖形的數量和位置也就肯定了;
格式信息:表示改二維碼的糾錯級別,分爲L、M、Q、H;

版本信息:即二維碼的規格,QR碼符號共有40種規格的矩陣(通常爲黑白色),從21x21(版本1),到177x177(版本40),每一版本符號比前一版本 每邊增長4個模塊。
數據和糾錯碼字:實際保存的二維碼信息,和糾錯碼字(用於修正二維碼損壞帶來的錯誤)。

簡要的編碼過程:
    1. 數據分析:肯定編碼的字符類型,按相應的字符集轉換成符號字符; 選擇糾錯等級,在規格必定的條件下,糾錯等級越高其真實數據的容量越小。

    2. 數據編碼:將數據字符轉換爲位流,每8位一個碼字,總體構成一個數據的碼字序列。其實知道這個數據碼字序列就知道了二維碼的數據內容。
二維碼的數據內容
二維碼的數據內容            數據能夠按照一種模式進行編碼,以便進行更高效的解碼,例如:對數據:01234567編碼(版本1-H),
            1)分組:012 345 67
             2)轉成二進制:012→0000001100
                                                   345→0101011001
                                                    67 →1000011
              3)轉成序列:0000001100 0101011001 1000011
              4)字符數 轉成二進制:8→0000001000
              5)加入模式指示符(上圖數字)0001:0001 0000001000 0000001100 0101011001 1000011
           對於字母、中文、日文等只是分組的方式、模式等內容有所區別。基本方法是一致的

    3. 糾錯編碼:按須要將上面的碼字序列分塊,並根據糾錯等級和分塊的碼字,產生糾錯碼字,並把糾錯碼字加入到數據碼字序列後面,成爲一個新的序列。
二維碼糾正容量        在二維碼規格和糾錯等級肯定的狀況下,其實它所能容納的碼字總數和糾錯碼字數也就肯定了,好比:版本10,糾錯等級時H時,總共能容納346個碼字,其中224個糾錯碼字。
        就是說二維碼區域中大約1/3的碼字時冗餘的。對於這224個糾錯碼字,它可以糾正112個替代錯誤(如黑白顛倒)或者224個據讀錯誤(沒法讀到或者沒法譯碼),
        這樣糾錯容量爲:112/346=32.4%
       
    4. 構造最終數據信息:在規格肯定的條件下,將上面產生的序列按次序放如分塊中
        按規定把數據分塊,而後對每一塊進行計算,得出相應的糾錯碼字區塊,把糾錯碼字區塊 按順序構成一個序列,添加到原先的數據碼字序列後面。
        如:D1, D12, D23, D35, D2, D13, D24, D36, ... D11, D22, D33, D45, D34, D46, E1, E23,E45, E67, E2, E24, E46, E68,...

構造矩陣:將探測圖形、分隔符、定位圖形、校訂圖形和碼字模塊放入矩陣中。
        二維碼的矩陣結構    
把上面的完整序列填充到相應規格的二維碼矩陣的區域中
    6. 掩摸:將掩摸圖形用於符號的編碼區域,使得二維碼圖形中的深色和淺色(黑色和白色)區域可以比率最優的分佈。
    7. 格式和版本信息:生成格式和版本信息放入相應區域內。
        版本7-40都包含了版本信息,沒有版本信息的全爲0。二維碼上兩個位置包含了版本信息,它們是冗餘的。
        版本信息共18位,6X3的矩陣,其中6位時數據爲,如版本號8,數據位的信息時 001000,後面的12位是糾錯位。
那麼利用PHP如何生成QR二維碼呢?
(1)利用Google API生成二維碼:
php

  1. $urlToEncode="http://www.phpddt.com";
  2. generateQRfromGoogle($urlToEncode);
  3. /**
  4. * google api 二維碼生成【QRcode能夠存儲最多4296個字母數字類型的任意文本,具體能夠查看二維碼數據格式】
  5. * @param string $chl 二維碼包含的信息,能夠是數字、字符、二進制信息、漢字。不能混合數據類型,數據必須通過UTF-8 URL-encoded.若是須要傳遞的信息超過2K個字節,請使用POST方式
  6. * @param int $widhtHeight 生成二維碼的尺寸設置
  7. * @param string $EC_level 可選糾錯級別,QR碼支持四個等級糾錯,用來恢復丟失的、讀錯的、模糊的、數據。
  8. * L-默認:能夠識別已損失的7%的數據
  9. * M-能夠識別已損失15%的數據
  10. * Q-能夠識別已損失25%的數據
  11. * H-能夠識別已損失30%的數據
  12. * @param int $margin 生成的二維碼離圖片邊框的距離
  13. */
  14. function generateQRfromGoogle($chl,$widhtHeight ='150',$EC_level='L',$margin='0')
  15. {
  16. $chl = urlencode($chl);
  17. echo '<img src="http://chart.apis.google.com/chart?chs='.$widhtHeight.'x'.$widhtHeight.'&cht=qr&chld='.$EC_level.'|'.$margin.'&chl='.$chl.'" alt="QR code" widhtHeight="'.$widhtHeight.'" widhtHeight="'.$widhtHeight.'"/>';
  18. }


(2)利用PHP二維碼生成工具PHP QR Code生成二維碼
PHP QR Code是一個PHP二維碼生成類庫,官網地址:http://phpqrcode.sourceforge.net/
下載完成後,你只須要使用phpqrcode.php就能夠生成二維碼(開啓gd2)了。由於文件代碼太長,這裏只解釋下生成二維碼的函數和參數: html

  1. /**
  2. *
  3. * @param type $text 生成二位的的信息文本
  4. * @param type $outfile 是否輸出二維碼圖片文件
  5. * @param type $level 容錯率,也就是二位可被覆蓋的區域還能識別 分別是L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%)
  6. * @param type $size 生成圖片大小默認是3
  7. * @param type $margin 二維碼周圍邊框空白區域margin值
  8. * @param boolean $saveandprint 保存二維碼並顯示
  9. * @return type
  10. * @edit link <http://www.phpddt.com>
  11. */
  12. publicstaticfunction png($text, $outfile =false, $level = QR_ECLEVEL_L, $size =3, $margin =4, $saveandprint=false)
  13. {
  14. $enc =QRencode::factory($level, $size, $margin);
  15. return $enc->encodePNG($text, $outfile, $saveandprint=false);
  16. }


使用起來灰常簡單的: api

  1. include 'phpqrcode.php';
  2. QRcode::png('http://www.phpddt.com');
  3. //還能夠保存圖片
  4. //QRcode::png('http://www.phpddt.com', 'test1.png', QR_ECLEVEL_L, 5, 0);


生成帶logo的二維碼圖片: 函數

  1. include 'phpqrcode.php';
  2. $value ='http://qr.phpddt.com';
  3. $errorCorrectionLevel ='L';
  4. $matrixPointSize =6;
  5. QRcode::png($value,'phpddt.png', $errorCorrectionLevel, $matrixPointSize,2);
  6. echo "QR code generated"."<br />";
  7. $logo ='logo.png';
  8. $QR ='phpddt.png';
  9.  
  10. if($logo !== FALSE){
  11. $QR = imagecreatefromstring(file_get_contents($QR));
  12. $logo = imagecreatefromstring(file_get_contents($logo));
  13. $QR_width = imagesx($QR);
  14. $QR_height = imagesy($QR);
  15. $logo_width = imagesx($logo);
  16. $logo_height = imagesy($logo);
  17. $logo_qr_width = $QR_width /5;
  18. $scale = $logo_width / $logo_qr_width;
  19. $logo_qr_height = $logo_height / $scale;
  20. $from_width =($QR_width - $logo_qr_width)/2;
  21. imagecopyresampled($QR, $logo, $from_width, $from_width,0,0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
  22. }
  23. imagepng($QR,'www.phpddt.com.png');

QR二維碼生成演示 工具

轉載請註明地址:  http://www.phpddt.com/php/php-qr-code.html 尊重他人勞動成果就是尊重本身!
相關文章
相關標籤/搜索