標籤:des style class blog code http
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:[email protected]". "\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;同Google 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.phpinclude(‘./phpqrcode/qrlib.php‘);
// 構建 vcard 資料$vcard = "BEGIN:VCARD". "\nVERSION:3.0". "\nFN:王歌". "\nTEL;CELL;VOICE:18858140621". "\nTEL;WORK;VOICE:0358-2157466". "\nEMAIL:[email protected]". "\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.phpinclude(‘./phpqrcode/qrlib.php‘);
// 構建 vcard 資料$vcard = "BEGIN:VCARD". "\nVERSION:3.0". "\nFN:王歌". "\nTEL;CELL;VOICE:18858140621". "\nTEL;WORK;VOICE:0358-2157466". "\nEMAIL:[email protected]". "\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);