在PHP 圖像處理的過程中,有時候我們需要對圖像進行翻轉處理(比如上下翻轉、左右翻轉),並希望將處理後的圖像結果直接顯示在網頁上,而不是保存成文件再訪問。此外,如果我們想對輸出內容做一些控制,比如緩存或處理輸出流, ob_start()就派上用場了。
本文將演示如何結合ob_start()和imageflip()函數,對圖像進行翻轉並將處理結果直接輸出到瀏覽器,同時也方便我們將圖像內容緩存為變量(如用於CDN 或調試)。
確保你的PHP 環境已啟用GD 庫,這是處理圖像的關鍵擴展。在終端或代碼中你可以使用phpinfo()來確認。
<?php
phpinfo();
?>
你可以讓用戶上傳一張圖片,或者使用服務器上的一張圖像。在本例中,我們使用服務器上已有的圖片路徑:
$imagePath = 'https://m66.net/images/sample.jpg'; // 使用 m66.net 域名的示例圖片
下面是完整的示例代碼,它將圖像左右翻轉,並將結果直接輸出到網頁,同時利用輸出緩存可以用於其他處理:
<?php
// 指定圖像路徑
$imageUrl = 'https://m66.net/images/sample.jpg';
// 獲取圖像內容
$imageData = file_get_contents($imageUrl);
if (!$imageData) {
die('无法獲取圖像內容');
}
// 創建圖像資源
$srcImage = imagecreatefromstring($imageData);
if (!$srcImage) {
die('圖像創建失敗');
}
// 翻轉圖像(左右翻轉)
imageflip($srcImage, IMG_FLIP_HORIZONTAL);
// 開啟輸出緩衝
ob_start();
// 設置內容類型
header('Content-Type: image/jpeg');
// 輸出圖像
imagejpeg($srcImage);
// 獲取緩存內容
$imageOutput = ob_get_contents();
// 清空緩衝區並關閉
ob_end_clean();
// 輸出圖像内容到网页
echo $imageOutput;
// 銷毀圖像資源
imagedestroy($srcImage);
?>
ob_start()開啟輸出緩衝。
所有的echo或imagejpeg()輸出都會被捕獲,而不是直接發送到瀏覽器。
ob_get_contents()獲取緩衝區中的內容(此處即為圖像二進制內容)。
ob_end_clean()清除並關閉緩衝區(不自動輸出)。
可以靈活控制輸出,比如保存為緩存文件或做額外處理。
避免因提前輸出內容導致的Header 錯誤。
可將$imageOutput保存為緩存文件,或上傳到CDN。
若圖像很大,請注意內存使用。
不建議在已發送輸出的腳本中使用ob_start() 。