data:[mime];base64, 直接嵌入 HTML/CSS/JS,減少 HTTP 請求。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...
<?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;
| 方式 | 語法 | 優點 | 缺點 |
|---|---|---|---|
| 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、需快取策略 |
<link rel="preload" as="image" href="..."> + 獨立 URL。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== time() ?>">(時間戳防快取)。
Base64 圖片嵌入是把雙面刃:小圖減少請求、大圖拖垮效能。**鐵律:超過 1KB 改用獨立 URL + CDN + 快取**。PHP 端提供 base64_encode/decode、mime_content_type、GD/Imagick 動態生成,配合正確 HTTP 標頭,即可靈活應對各種圖片輸出場景。