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

PHP 使用 Base64 編碼圖片輸出與嵌入(Data URI、檔案儲存、效能權衡)

     編輯:PHP 相關知識

核心概念

  • Base64 編碼:將二進位資料轉為 ASCII 字串,體積膨脹約 33%。
  • Data URI:data:[mime];base64, 直接嵌入 HTML/CSS/JS,減少 HTTP 請求。
  • 適用場景:小圖示(<1KB)、單頁應用關鍵圖片、郵件模板、離線頁面、API 回應內嵌圖片。

圖片 → Base64 字串(PHP 端)

function imageToBase64(string $imagePath): string {
    if (!file_exists($imagePath)) throw new InvalidArgumentException('Image not found');
    $mime = mime_content_type($imagePath); // 需 fileinfo 擴展
    $data = base64_encode(file_get_contents($imagePath));
    return "data:$mime;base64,$data";
}

// 使用
$imgDataUri = imageToBase64(__DIR__ . '/logo.png');
// 輸出:data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...

Base64 字串 → 圖片輸出(直接瀏覽器顯示)

<?php
// show-base64.php
$base64 = 'iVBORw0KGgoAAAANSUhEUg...'; // 來自資料庫/快取/參數
$binary = base64_decode($base64);
if ($binary === false) {
    http_response_code(400);
    exit('Invalid Base64');
}
// 可從 Base64 標頭推斷 MIME,或固定
header('Content-Type: image/png');
header('Content-Length: ' . strlen($binary));
echo $binary;

HTML 嵌入方式比較

方式語法優點缺點
Data URI (img src)<img src="data:image/png;base64,...">零請求、離線可用、郵件相容HTML 體積暴增、無法快取、阻塞渲染
Data URI (CSS background)background: url(data:image/png;base64,...)CSS 合併快取、Sprite 替代CSS 體積增大、維護困難
獨立圖片 URL<img src="/img/logo.png">瀏覽器快取、CDN 加速、並行下載額外 HTTP 請求
PHP 輸出圖片<img src="show-base64.php?id=123">動態生成、權限控制、水印每次請求執行 PHP、需快取策略

效能權衡與最佳實踐

  • 小圖示(< 1KB):Data URI 可接受,甚至優於請求開銷。
  • 大圖片(> 10KB):嚴禁 Data URI**,必須用獨立 URL + CDN + 快取標頭。
  • 關鍵渲染路徑:首屏關鍵圖片(Logo、Hero Image)用 <link rel="preload" as="image" href="..."> + 獨立 URL。
  • Base64 解碼成本:瀏覽器解碼 Base64 需 CPU 時間,移動裝置明顯。
  • 資料庫儲存:圖片二進位存 BLOB 或檔案系統存路徑,**勿存 Base64 字串**(佔空間大、無法流式讀取、備份慢)。

進階:動態生成帶參數圖片(驗證碼、圖表、水印)

<?php
// captcha.php
session_start();
$code = random_int(1000, 9999);
$_SESSION['captcha'] = $code;

$im = imagecreatetruecolor(120, 40);
$bg = imagecolorallocate($im, 255, 255, 255);
$text = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 120, 40, $bg);
imagettftext($im, 20, 0, 15, 30, $text, __DIR__ . '/fonts/arial.ttf', $code);
// 干擾線...
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);

HTML:<img src="captcha.php?t=">(時間戳防快取)。

結語

Base64 圖片嵌入是把雙面刃:小圖減少請求、大圖拖垮效能。**鐵律:超過 1KB 改用獨立 URL + CDN + 快取**。PHP 端提供 base64_encode/decode、mime_content_type、GD/Imagick 動態生成,配合正確 HTTP 標頭,即可靈活應對各種圖片輸出場景。

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