PHP 自定義二維碼生成


環境: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;注意實際圖片大小還受到setPaddingsetLabelFontSize的影響

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

 


免責聲明!

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



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