環境:PHP 7.*.* ,Composer 包管理工具、QrCode
效果如下:
使用 Composer 安裝 QrCode
QrCode 類庫基於 php 的 GD 庫,用於生成任意尺寸的二維碼,並且可以將 logo 水印也打上去,還可以在二維碼圖片下方加入文字。
QrCode 的項目地址:https://github.com/endroid/QrCode
在命令行下操作安裝QrCode類:在 composer.json 中添加 qrcode,執行 composer 更新命令,如下
php composer.phar update
安裝成功后會出現兩個目錄 endroid、symfony,
endroid 目錄就是本次 QrCode 的類庫文件了,
而 symfony 目錄則是 endroid 依賴的另外一個php類庫,安裝QrCode庫時symfony會自動安裝,不用手動處理依賴關系。
而autoload.php
文件則是composer自動為我們處理好的php類加載器,我們要調用由composer安裝的某個類時,引用這個文件即可,不用再去include一堆文件了,這就是命名空間與文件存儲路徑按一定規則一一對應,並利用php的spl_autoload_register
函數實現的自動加載機制實現各個類的自動加載功能,所以我們要調用由composer安裝的類時只需要引入autoload.php
這個加載器文件就可以了。如果我們自己的項目也有自動加載器也並不影響,這就是spl_autoload_register
這個函數的好處了,可以存在多個加載器。
QrCode調用的代碼示例:
新建一個 index.php 直接調用就可以了,代碼中會有一些解釋,代碼如下:
<?php /** * php7下生成二維碼 * `利用composer管理類` * @authors Ryan Zheng * @date 2018-11-25 23:54:05 * @version 1.1 */ error_reporting(0); //引入composer自動生成的類加載器 require_once 'vendor/autoload.php'; //命名空間方式調用QrCode類 use Endroid\QrCode\QrCode as EndroidQrCode;//將QrCode命名空間騰出來 //處理需生成二維碼的內容、參數和文字 // $data = trim($_GET['data']) ? trim($_GET['data']) : 'http://www.cnblogs.com/ryanzheng'; $data = trim($_GET['data']) ? trim($_GET['data']) : 'https://google.com'; $size = intval($_GET['size']) > 1000 ? 1000 : intval($_GET['size']); $label = trim($_GET['label']) ? trim($_GET['label']) : null; $QrModel = new EndroidQrCode(); ##默認參數 $QrModel->setText($data) //設置二維碼上的內容 ->setPadding(5) //設置二維碼內容距離圖片邊緣的便宜量,單位:像素px ->setErrorCorrection('high') //設置二維碼的糾錯率,可以有low、medium、quartile、hign多個糾錯率 ->setForegroundColor(array('r' => 0, 'g' => 0, 'b' => 0, 'a' => 0)) //設置二維碼的rgb顏色和透明度a,這里是黑色 ->setBackgroundColor(array('r' => 255, 'g' => 255, 'b' => 255, 'a' => 0)) //設置二維碼圖片的背景底色,這里是白色 ->setImageType(EndroidQrCode::IMAGE_TYPE_PNG);//設置輸出的二維碼圖片格式,這里設置成png格式,還可以有gif、jpeg、wbmp ###可能的指定生成的二維碼尺寸,由get變量獲取 $size ? $QrModel->setSize(intval($size)) : $QrModel->setSize(190); ###可能的指定二維碼下方的文字,由get變量獲取;寫死15px的字體大小,方正靜蕾簡體手寫體的字體 $label && $QrModel->setLabelFontPath('./font/yaya.ttf')->setLabel($label)->setLabelFontSize(15); ###設置輸出的header頭:輸出的內容是一張圖片 // header('Content-Type: '.$QrModel->getContentType()); ##QrCode類的輸出png圖片數據的方法輸出圖片,這個時候使用瀏覽器訪問這個Url將顯示一張二維碼圖片 // $QrModel->render(); ###如果要加上logo水印,則在調用render方法之前調用setLogo和setLogoSize方法 $QrModel->setLogo('./ryan.jpg');//設置logo水印圖片的路徑,相對路徑和絕對路徑均可,這里`./logo.png`表示使用與本文件平級的logo.png $QrModel->setLogoSize(48);//設置logo水印的大小,參數是一個int數字,單位px (注意:這里假設你的logo是一個正方形) header('Content-Type: '.$QrModel->getContentType()); $QrModel->render();
1、設置二維碼的內容方法:setText
,參數為需要寫入到二維碼圖像中的文本內容,可以是任意文本,但不能超過二維碼圖像的信息容量
2、設置二維碼尺寸的方法:setSize
,參數為int型的數字,單位為像素px;注意實際圖片大小還受到setPadding
和setLabelFontSize
的影響
3、設置二維碼距離邊界的偏移量方法:setPadding
,參數為int型的數字,單位為像素px
4、設置水印和水印尺寸的方法:setLogo
方法指定水印圖片的路徑,也就是該方法的參數是水印圖片的路徑,可以是相對路徑,也可以是絕對路徑,以及setLogoSize
方法設置水印圖片尺寸大小,參數為int型的數字,單位為像素px,默認值為48,這個方法設置了水印圖片在二維碼圖中的大小,並且假設了你的logo是個正方形,所以要留意參數范圍。
5、設置label和label字體大小以及字體的方法:setLabelFontPath
方法指定生成label文字的字體文件位置,參數是字體文件的路徑、setLabel
設置指定label的內容、setLabelFontSize
設置生成的label字體的大小,參數為int型的數字,單位為像素px
6、如果生成的二維碼圖片不是輸出到瀏覽器,需要保存到服務器中,使用save
方法,參數是保存這張二維碼圖片的路徑,相對路徑和絕對路徑均可。
需要注意的是:composer需要php5.3.2以上的php環境,本次試驗環境是php7.0.11,QrCode支持鏈式調用,所以寫法上要能理解。
幾個留意點
1、QrCode生成中文漢字的label的問題:需要引入中文字體,所以需要調用setLabelFontPath
方法傳入一個中文字體的路徑,QrCode默認提供有一個字體為opensans.ttf
,在\vendor\endroid\qrcode\assets\font
路徑下,但QrCode類並未默認調用這個字體,若不調用setLabelFontPath
方法設置字體的話,生成中文的label會是小方框。另外需要使用UTF8編碼的中文設置label
2、GD庫編譯參數的影響:當編譯php時加上了–enable-gd-jis-conv
參數的話,也就是讓php的GD庫支持日文編碼的字庫;簡單點來說:開啟了這個選項的話GD就會把TTF字庫中大於127的部分(即不屬於標准拉丁文字庫的部分)按照日文JIS的順序來映射,那么用來映射中文字體的時候自然就變成亂碼了。如果你的php開啟了–enable-gd-jis-conv
選項,設置中文label時縱使你傳入的是utf8編碼的也會出現亂碼錯誤,原因前述已解釋。考慮到國內制作圖片時需要支持鬼子文字的情況較少,建議編譯php時去除–enable-gd-jis-conv
選項。
3、若調用QrCode代碼生成二維碼出現錯誤,請檢查你的php版本,還有GD庫編譯參數:譬如是否支持png、jpeg、gif、wbmp等。
以上代碼可以到我的 github 直接下載使用(好用的話記得給個 star):
https://github.com/zhengjianhong001/QR-code-generation