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

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

 方法一:谷歌二維碼APIapi

接口地址: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方式google

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

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

  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

相關文章
相關標籤/搜索