在程序項目開發的過程中我們免不了要實現一種功能。例如海報的生成,照片和文字合成一張新的圖片。php中怎么實現
實現功能
文字和照片合成一張新的照片,并且自適應換行并加上簽名和日期,加上字體樣式,下面我們就開實現該功能
實現步驟簡述
1.加載原始圖片:使用imagecreatefromjpeg
, imagecreatefrompng
, 或 imagecreatefromgif
等函數根據圖片類型加載圖片。
2.設置字體顏色、大小和樣式:通過imagecolorallocate
分配顏色,使用GD
的內置字體或自定義字體。
3.處理文字換行:計算每行文字的寬度,以適應圖片寬度進行換行處理。
在圖片上繪制文字:使用imagettftext
函數逐行繪制文字到圖片上。
4.輸出或保存合成圖片:使用header
設置正確的MIME
類型后直接輸出,或用imagejpeg
, imagepng
, imagegif
等函數保存到文件。
// 引入GD庫
if (!function_exists('imagettftext')) {die('GD庫未安裝或不支持TrueType文本');
}// 圖片路徑
$imagePath = './example.jpg';
// 輸出圖片路徑(如果需要保存)
$outputPath = './output.jpg';// 加載圖片
$im = imagecreatefromjpeg($imagePath);
list($width, $height) = getimagesize($imagePath);// 設置文字參數
$text = "這是一段示例文字\n它包含換行\n第三行文字";
$fontColor = imagecolorallocate($im, 255, 255, 255); // 白色
$fontSize = 20;
$fontFile = './simhei.ttf'; // 確保字體文件存在// 文字位置起始點(左上角)
$x = 10;
$y = 50;// 處理換行
$lines = explode("\n", $text);
foreach ($lines as $line) {// 計算當前行的文字高度,用于垂直定位下一行$textBox = imagettfbbox($fontSize, 0, $fontFile, $line);$textWidth = max(array($textBox[2], $textBox[4])); // 獲取最大寬度$textHeight = abs($textBox[7] - $textBox[1]); // 獲取高度// 如果文字超出圖片寬度,則調整字體大小或換行邏輯if ($textWidth > $width - 20) {echo "警告: 文字寬度超過圖片寬度,請調整字體大小或文字內容。";break;}// 繪制文字imagettftext($im, $fontSize, 0, $x, $y, $fontColor, $fontFile, $line);$y += $textHeight + 10; // 移動到下一行
}// 輸出圖片到瀏覽器
header('Content-Type: image/jpeg');
imagejpeg($im);// 如果需要保存到文件
// imagejpeg($im, $outputPath);// 釋放內存
imagedestroy($im);
確保服務器已安裝GD庫并支持TrueType字體。
替換$fontFile變量為實際的字體文件路徑,確保該字體支持中文(如simsun.ttc或simhei.ttf)。
根據實際情況調整文字位置、顏色、大小等參數。
如果文字內容動態變化且長度未知,可能需要更復雜的邏輯來處理文字換行,確保文字不會超出圖片邊界。
通過上述代碼如果我們需要增加一個合成的內容區塊那么就可以這樣做例如我們要加入簽名
// ... 上述代碼保持不變 ...// 文字位置起始點(左上角)
$x = 10;
$y = 50;// 繪制主要文字內容
// ... 繪制文字的循環代碼保持不變 ...// 添加簽名和時間到右下角
$signature = "簽名: 作者";
$time = date("Y-m-d H:i:s"); // 獲取當前時間格式化字符串
$combinedText = $signature . "\n" . $time;// 計算簽名和時間的文本框,以確定其大小
$textBox = imagettfbbox($fontSize, 0, $fontFile, $combinedText);
$textWidth = max(array($textBox[2], $textBox[4]));
$textHeight = abs($textBox[7] - $textBox[1]);// 設置右下角的起始坐標
$x = $width - $textWidth - 10;
$y = $height - $textHeight - 10;// 繪制簽名和時間
imagettftext($im, $fontSize, 0, $x, $y, $fontColor, $fontFile, $combinedText);// 輸出圖片到瀏覽器
header('Content-Type: image/jpeg');
imagejpeg($im);// 保存圖片到文件
imagejpeg($im, $outputPath);echo "圖片已成功保存至: " . $outputPath;// 釋放內存
imagedestroy($im);
比如我們要加入簽名圖片那么我們可以這么做
// ... 上述代碼保持不變 ...// 加載簽名圖片
$signatureImagePath = './signature.png';
$signatureIm = imagecreatefrompng($signatureImagePath);
$signatureWidth = imagesx($signatureIm);
$signatureHeight = imagesy($signatureIm);// 計算簽名圖片的位置,確保在右下角
$x = $width - $signatureWidth - 10;
$y = $height - $signatureHeight - 10;// 合并簽名圖片到主圖片
imagecopy($im, $signatureIm, $x, $y, 0, 0, $signatureWidth, $signatureHeight);// 銷毀簽名圖片資源
imagedestroy($signatureIm);// 繪制簽名和時間到右下角
// ... 與之前示例中的簽名和時間繪制代碼保持不變 ...// 輸出圖片到瀏覽器
header('Content-Type: image/jpeg');
imagejpeg($im);// 保存圖片到文件
imagejpeg($im, $outputPath);echo "圖片已成功保存至: " . $outputPath;// 釋放內存
imagedestroy($im);
整體就算完成了,剩下的自己研究,僅僅是一個方法,有很多可取代的方法,自行研究。學無止境。