首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 生成二維碼兩大方案:Google Chart API 與 PHP QR Code 庫完整指南

     編輯:PHP 相關知識

二維碼廣泛應用於行銷、支付、登入、防偽等場景。本文介紹兩種主流 PHP 生成方案:零依賴呼叫 Google Chart API 與 本地化 PHP QR Code 庫,並詳細示範如何在二維碼中心嵌入 Logo 圖片。

方案一:Google Chart API (已停止維護,僅供參考)

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 英數字元
  • 錯誤修正級別:L(7%)、M(15%)、Q(25%)、H(30%)。級別越高,容錯越強、圖案越密集。
  • 缺點:依賴外部服務、有頻率限制、無法離線、無法自訂樣式/嵌入 Logo、隱私風險。

方案二:PHP QR Code 庫 (推薦,本地化生成)

官網: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);

進階:二維碼中心嵌入 Logo

原理:利用 QR Code 的錯誤修正特性,遮蓋中心區域仍可識讀。步驟:

  1. 生成高錯誤修正級別 (H 或 Q) 的二維碼圖片。
  2. 載入 Logo 圖片,計算縮放比例使其適配中心區域 (建議佔整體 1/5 ~ 1/4)。
  3. 使用 imagecopyresampled() 將 Logo 疊加至二維碼中心。
  4. 輸出合成圖片。

完整實作代碼

<?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 檔案不存在';
}
?>

關鍵技術細節

  • 錯誤修正級別選 H:Logo 遮蓋約 4-6% 面積,H 級可修正 30% 損壞,安全邊際充足。
  • 矩陣尺寸選較大:$matrixPointSize >= 6 確保模組夠大,Logo 縮放後不會模糊。
  • 保持 Logo 透明度:使用 PNG 格式 Logo,imagecopyresampled 會自動處理 Alpha 通道。
  • 驗證可讀性:生成後務必用多款掃碼 App (微信、支付寶、iOS 相機、Android Google Lens) 實測。
  • 白邊保留:QR Code 規範要求四周留白 (Quiet Zone),$margin >= 2 確保識別率。

現代替代庫推薦

庫特點Composer 包
bacon/bacon-qr-code現代重寫、支援 SVG/EPS/PNG、可擴展渲染器、無外部依賴composer require bacon/bacon-qr-code
endroid/qr-codeLaravel/Symfony 整合優、支援 Logo、顏色、標籤、驗證、回應物件composer require endroid/qr-code
chillerlan/php-qrcode功能最全、支援多種輸出格式、Logo、圓角、漸層、動畫 QR、Unicodecomposer require chillerlan/php-qrcode

結語

本地化生成是現代專案標配,PHP QR Code 歷史悠久但已停止更新,新專案強烈建議採用 bacon/bacon-qr-code 或 endroid/qr-code,獲得更好維護性、型別安全與擴展性。嵌入 Logo 時務必選高錯誤修正級別並實測驗證,確保商業場景下的可靠性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved