1. 程式人生 > >PHP 自定義二維碼生成

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