PHP生成二維碼【谷歌API+qrcode+圓角Logo】


這幾天在開發公司的企業版塊,想在每個企業的展示頁面上添加一個公司的二維碼,通過掃描二維碼便可以將公司的信息導入手機通訊錄中,想法產生了,於是開始搜索PHP生成二維碼的方法,比較流行的方法主要有兩種:1谷歌二維碼API;2 PHP QR CODE;本文將重點介紹這兩種方法。

 方法一:谷歌二維碼API

接口地址:https://chart.googleapis.com/chart

官方文檔:https://developers.google.com/chart/infographics/docs/qr_codes

參數說明:

cht=qr:必要參數,固定值<qr>,表明要生成二維碼

chs=<width>x<height>必要參數,生成二維碼尺寸,單位是像素,目前生成的二維碼都是正方形的,所以兩個寬高值都設置為一樣的值

chl=<data>必要參數,生成二維碼包含的信息,可以是數字、字符、二進制信息、漢字。不能混合數據類型,數據必須經過UTF-8 URL-encoded.如果需要傳遞的信息超過2K個字節,需使用POST方式

choe=<output_encoding>可選參數,編碼格式。包括UTF-8/Shift_JIS/ISO-8859-1三個選項,默認為UTF-8。

chld=<error_correction_level>|<margin>可選參數,

  error_correction_level:容錯級別(共分四個等級,L-默認:可以識別已損失的7%的數據;M-可以識別已損失15%的數據;Q-可以識別已損失25%的數據;H-可以識別已損失30%的數據)

  margin:生成的二維碼離圖片邊框的距離

 

例一:掃描二維碼打開網址(API)

<?php //二維碼信息,用urlencode編碼
$data = urlencode('http://www.baidu.com'); //生成二維碼尺寸
$size = '300x300'; //完整的API地址
$qrurl = "http://chart.googleapis.com/chart?chs=$size&cht=qr&chl=$data&chld=L|1&choe=UTF-8"; //獲取二維碼
$qrcode = file_get_contents($qrurl); //輸出圖片
header('Content-type: image/png'); echo $qrcode;

 在打開一個網站之后,我們要來實現歸初的目的,掃描二維碼,將企業信息導入通訊錄,即在二維碼中包含一個名片信息,其實二維碼說白了就是將一堆信息轉換為圖片的形式表達,而這堆信息到底是什么樣子的它並不關心,真正關心這些信息的是掃描二維碼的工具,以上面的例子來說,當你用微信掃描二維碼后,微信讀取到二維碼中儲存的數據,然后嘗試開始辨別它,當它發現內容是百度的網址時便使用瀏覽器打開它,同樣的當它發現內容是一堆簡單的文本數據時便以文本的形式來顯示,同樣的微信還可以辨別出二維碼的內容是不是一個 vcard 格式的電子名片,我們的手機通訊錄導入導出的時候大多是這種格式,所以我們可以直接在二維碼中包含一個標准的 vcard 電子名片,這樣就可以讓掃描工具將它識別為通訊錄。

vcard 格式參考如下: BEGIN:VCARD
VERSION:3.0
FN:用戶名
TEL;CELL;VOICE:18858140621
TEL;WORK;VOICE:0358-2157466
TEL;WORK;FAX:0358-2157466
EMAIL;PREF;INTERNET:lzw#lzw.me
URL:http://lzw.me
orG:志文工作室
ROLE:產品部
TITLE:CTO
ADR;WORK;POSTAL:北京市朝陽區北四環中路35號;100101
REV:2012-12-27T08:30:02Z
END:VCARD
如果你想更詳細的定制所需要的格式,請百度 vcard 的格式標准。

 例二:生成一個名片二維碼(API)

<?php //構建一個 vcard 格式數據
$vcard = 
    "BEGIN:VCARD".
    "\nVERSION:3.0".
    "\nFN:小編絡絡".
    "\nTEL;CELL;VOICE:18858140621".
    "\nTEL;WORK;VOICE:0358-2157466".
    "\nEMAIL:luoluo@qq.com".
    "\nURL:http://www.baidu.com".
    "\nADR:浙江省杭州市濱江區".
    "\nEND:VCARD"; //二維碼信息,用urlencode編碼
$data = urlencode($vcard); //生成二維碼尺寸
$size = '300x300'; //完整的API地址
$qrurl = "http://chart.googleapis.com/chart?chs=$size&cht=qr&chl=$data&chld=L|1&choe=UTF-8"; //獲取二維碼
$qrcode = file_get_contents($qrurl); //輸出圖片
header('Content-type: image/png'); echo $qrcode;

 到此為止我們歸初的目的已經基本實現,但實際使用中,由於直接將上述拼裝好的 url 加到了 img 標簽的 src 屬性,結果出了點小問題,由於我們的名片信息比較多,導致了二維碼生成錯誤,在本文開頭已經用紅色字體標出,get 方式最多只能傳遞 2K 大的數據,大於 2K 數據時我們需要使用 POST 請求,所以在實際使用中,可以先在程序中通過 POST 方式獲取二維碼並保存為本地圖片,之后直接調用本地圖片即可。

 

方法二:使用 PHP QR CODE 生成二維碼

官方主頁:http://phpqrcode.sourceforge.net

下載地址:http://sourceforge.net/projects/phpqrcode/

使用方法:QRcode::png($data, $filename , $errorCorrectionLevel, $matrixPointSize, $margin );

    * $data 數據  
    * $filename 生成二維碼保存路徑,如果為 false 直接輸出到瀏覽器 
    *$errorCorrectionLevel 錯誤處理級別  L、M、Q、H;同谷歌 API 中糾錯級別
    * $matrixPointSize 每個黑點的像素  
    * $margin 圖片外圍的白色邊框像素

 

例三:掃描二維碼打開網址(phpqrcode)

<?php // 包含 qrlib.php 或 phpqrcode.php 
// 包含 qrlib.php 需要同其它文件放到一起; phpqrcode.php 是合並后版本,只需要包含這個文件,但生成的圖片速度慢而且不太准確
include('./phpqrcode/qrlib.php'); // 二維碼數據 $data = 'http://www.111cn.net'; // 糾錯級別:L、M、Q、H $errorCorrectionLevel = 'L'; // 點的大小:1到10 $matrixPointSize = 5; QRcode::png($data, false, $errorCorrectionLevel, $matrixPointSize, 2);

 

 例二:生成一個名片二維碼(phpqrcode)

<?php
// 包含 qrlib.php 或 phpqrcode.php
include('./phpqrcode/qrlib.php');
// 構建 vcard 數據
$vcard = "BEGIN:VCARD". "\nVERSION:3.0". "\nFN:王歌". "\nTEL;CELL;VOICE:18858140621". "\nTEL;WORK;VOICE:0358-2157466". "\nEMAIL:wang@qq.com". "\nURL:http://www.mailuow.com". "\nADR:浙江省杭州市濱江區江虹路1750號". "\nEND:VCARD"; // 糾錯級別:L、M、Q、H $errorCorrectionLevel = 'L'; // 點的大小:1到10 $matrixPointSize = 4; QRcode::png($vcard, false, $errorCorrectionLevel, $matrixPointSize, 2);

 

 

到此為止我們已經可以用兩種方法來實現最初的想法了,但二維碼是掛上去了,功能也實現了,不過總覺得不夠華麗,如果再能把企業的 logo 嵌到二維碼當中就好了,嘿嘿,當然這部分工作已經不在二維碼生成的范籌了,接下來就要靠我們 PHP 中的 GD 庫來完成了,但是有一點需要了解,我們在前面提到過二維碼的容錯級別,即二維碼在損毀一部分之后仍有可能解析出完整信息,而給二維碼中間添加 logo 后仍能解讀出完整信息靠的正是它的高容錯性。

網上有找到一些 PHP 生成帶 Logo 二維碼的方法,但不夠細致,生成的二維碼很難看,筆者試過好幾種方法,現將效果最好的一種拿出來與大家分享。

整體思路如下圖:

例五:生成帶 Logo 二維碼

<?php
// 包含 qrlib.php 或 phpqrcode.php
include('./phpqrcode/qrlib.php');
// 構建 vcard 數據
$vcard = "BEGIN:VCARD". "\nVERSION:3.0". "\nFN:王歌". "\nTEL;CELL;VOICE:18858140621". "\nTEL;WORK;VOICE:0358-2157466". "\nEMAIL:wang@qq.com". "\nURL:http://www.mailuow.com". "\nADR:浙江省杭州市濱江區江虹路1750號". "\nEND:VCARD"; // 糾錯級別:L、M、Q、H $errorCorrectionLevel = 'M'; // 點的大小:1到10 $matrixPointSize = 4; // 保存文件名 $filename = 'test.png'; //生成二維碼 QRcode::png($vcard, $filename, $errorCorrectionLevel, $matrixPointSize, 2); //獲取二維碼 $qrcode = file_get_contents($filename); $qrcode = imagecreatefromstring($qrcode); $qrcode_width = imagesx($qrcode); $qrcode_height = imagesy($qrcode); //圓角圖片 $corner = file_get_contents('./images/corner.png'); $corner = imagecreatefromstring($corner); $corner_width = imagesx($corner); $corner_height = imagesy($corner); //計算圓角圖片的寬高及相對於二維碼的擺放位置,將圓角圖片拷貝到二維碼中央 $corner_qr_height = $corner_qr_width = $qrcode_width/5; $from_width = ($qrcode_width-$corner_qr_width)/2; imagecopyresampled($qrcode, $corner, $from_width, $from_width, 0, 0, $corner_qr_width, $corner_qr_height, $corner_width, $corner_height); //logo圖片 $logo = file_get_contents('./images/logo.jpg'); $logo = imagecreatefromstring($logo); $logo_width = imagesx($logo); $logo_height = imagesy($logo); //計算logo圖片的寬高及相對於二維碼的擺放位置,將logo拷貝到二維碼中央 $logo_qr_height = $logo_qr_width = $qrcode_width/5 - 6; $from_width = ($qrcode_width-$logo_qr_width)/2; imagecopyresampled($qrcode, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height); header('Content-type: image/png'); imagepng($qrcode); imagedestroy($qrcode);

imagedestroy($corner);
imagedestroy($logo);

 

 本例中使用到的 corner 圖片: 右擊另存為

 本例中所有代碼示例下載:http://yun.baidu.com/s/1c0ovV6w

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM