使用 GD 庫處理圖片後,imagejpeg() 等函數只能直接輸出到瀏覽器或寫入檔案。若需將圖片二進制內容存入資料庫、傳遞給 API 或進行進一步處理,需先捕獲輸出緩衝區內容。
<?php
$imgPath = 'path/to/image.jpg';
// 1. 獲取圖片資訊(支援遠端 URL)
list($srcWidth, $srcHeight, $type) = getimagesize($imgPath);
// 2. 根據類型建立圖片資源
switch ($type) {
case IMAGETYPE_GIF: $createFunc = 'imagecreatefromgif'; break;
case IMAGETYPE_JPEG: $createFunc = 'imagecreatefromjpeg'; break;
case IMAGETYPE_PNG: $createFunc = 'imagecreatefrompng'; break;
default: return false;
}
$orig = $createFunc($imgPath);
// ... 此處可進行縮放、裁切、加水印等處理 ...
// 3. 開啟輸出緩衝
ob_start();
// 4. 輸出圖片到緩衝區
switch ($type) {
case IMAGETYPE_GIF: imagegif($orig); break;
case IMAGETYPE_JPEG: imagejpeg($orig, null, 90); break; // 品質 90
case IMAGETYPE_PNG: imagepng($orig, 0); break; // 無壓縮
}
// 5. 獲取緩衝內容並關閉緩衝
$imageBinary = ob_get_contents();
ob_end_clean();
// 6. 釋放圖片資源
imagedestroy($orig);
// $imageBinary 現在包含完整的圖片二進制資料
// 可直接:存入資料庫 BLOB 欄位、base64_encode 傳輸、寫入檔案等
file_put_contents('output.jpg', $imageBinary);
| 函數 | 用途 |
|---|---|
ob_start() | 開啟輸出緩衝,後續 echo/print/圖片輸出函數不會直接發送到瀏覽器 |
ob_get_contents() | 獲取當前緩衝區內容(字串) |
ob_end_clean() | 清空緩衝並關閉輸出緩衝 |
不建議將大型圖片長期存放於變數/資料庫中。
memory_limit 限制imagejpeg($orig, $targetPath) 直接寫檔,再存路徑header('Content-Type: image/jpeg'); imagejpeg($orig);ob_start() 捕獲 GD 輸出是經典技巧,適合「圖片變數化」的短暫需求。生產系統中,優先選擇檔案系統存儲 + 路徑記錄,僅在 API 回傳 Base64、異步隊列傳遞二進制等特定場景使用變數暫存。