二維碼廣泛應用於行銷、支付、登入、防偽等場景。本文介紹兩種主流 PHP 生成方案:零依賴呼叫 Google Chart API 與 本地化 PHP QR Code 庫,並詳細示範如何在二維碼中心嵌入 Logo 圖片。
Google 於 2019 年正式關閉 Chart API 服務,現代專案不建議使用,但原理具參考價值。
function generateQRfromGoogle($chl, $widthHeight = 150, $EC_level = 'L', $margin = 0) {
$chl = urlencode($chl);
echo '<img src="https://chart.googleapis.com/chart?chs='
. $widthHeight . 'x' . $widthHeight
. '&cht=qr&chld=' . $EC_level . '|' . $margin
. '&chl=' . $chl . '" alt="QR code" width="' . $widthHeight
. '" height="' . $widthHeight . '"/>';
}
// 使用
generateQRfromGoogle('https://www.example.com');
| 參數 | 說明 | 可選值 |
|---|---|---|
chs | 圖片尺寸 (寬x高) | 如 150x150,最大 500x500 |
cht=qr | 圖表類型:QR Code | 固定 |
chld | 錯誤修正級別 | 邊距 | L|0 ~ H|4 |
chl | 編碼內容 (需 URL encode) | 最多 4296 英數字元 |
官網:phpqrcode.sourceforge.net,需 GD2 擴展支援。
QRcode::png(
$text, // 編碼內容
$outfile = false, // 輸出檔案路徑,false 直接輸出瀏覽器
$level = QR_ECLEVEL_L, // 錯誤修正 L/M/Q/H
$size = 3, // 模組大小 (1-10),影響最終圖片尺寸
$margin = 4, // 靜區邊距 (模組數)
$saveandprint = false // true 同時存檔並輸出
);
include 'phpqrcode.php';
QRcode::png('https://www.example.com'); // 直接輸出 PNG 圖片流
QRcode::png('https://www.example.com', 'qrcode.png', QR_ECLEVEL_L, 6, 2);
原理:利用 QR Code 的錯誤修正特性,遮蓋中心區域仍可識讀。步驟:
imagecopyresampled() 將 Logo 疊加至二維碼中心。<?php
include 'phpqrcode.php';
$value = 'https://www.example.com';
$errorCorrectionLevel = 'H'; // 高容錯,支援 Logo 遮蓋
$matrixPointSize = 8; // 較大尺寸,留出 Logo 空間
// 1. 生成基礎二維碼
QRcode::png($value, 'qrcode.png', $errorCorrectionLevel, $matrixPointSize, 2);
$logoFile = 'logo.png';
$qrFile = 'qrcode.png';
if (file_exists($logoFile)) {
// 2. 載入圖片資源
$qr = imagecreatefromstring(file_get_contents($qrFile));
$logo = imagecreatefromstring(file_get_contents($logoFile));
$qrWidth = imagesx($qr);
$qrHeight = imagesy($qr);
$logoWidth = imagesx($logo);
$logoHeight = imagesy($logo);
// 3. 計算 Logo 目標尺寸 (佔二維碼 1/5)
$logoQrWidth = $qrWidth / 5;
$scale = $logoWidth / $logoQrWidth;
$logoQrHeight = $logoHeight / $scale;
// 4. 計算置中座標
$fromX = ($qrWidth - $logoQrWidth) / 2;
$fromY = ($qrHeight - $logoQrHeight) / 2;
// 5. 疊加合成 (支援透明通道)
imagecopyresampled($qr, $logo, $fromX, $fromY, 0, 0,
$logoQrWidth, $logoQrHeight, $logoWidth, $logoHeight);
// 6. 輸出最終圖片
imagepng($qr, 'final_qrcode.png');
imagedestroy($qr);
imagedestroy($logo);
echo '<img src="final_qrcode.png" alt="QR Code with Logo"/>';
} else {
echo 'Logo 檔案不存在';
}
?>
$matrixPointSize >= 6 確保模組夠大,Logo 縮放後不會模糊。imagecopyresampled 會自動處理 Alpha 通道。$margin >= 2 確保識別率。| 庫 | 特點 | Composer 包 |
|---|---|---|
| bacon/bacon-qr-code | 現代重寫、支援 SVG/EPS/PNG、可擴展渲染器、無外部依賴 | composer require bacon/bacon-qr-code |
| endroid/qr-code | Laravel/Symfony 整合優、支援 Logo、顏色、標籤、驗證、回應物件 | composer require endroid/qr-code |
| chillerlan/php-qrcode | 功能最全、支援多種輸出格式、Logo、圓角、漸層、動畫 QR、Unicode | composer require chillerlan/php-qrcode |
本地化生成是現代專案標配,PHP QR Code 歷史悠久但已停止更新,新專案強烈建議採用 bacon/bacon-qr-code 或 endroid/qr-code,獲得更好維護性、型別安全與擴展性。嵌入 Logo 時務必選高錯誤修正級別並實測驗證,確保商業場景下的可靠性。