PHP利用GD庫實現圖片合成功能方法

在程序項目開發的過程中我們免不了要實現一種功能。例如海報的生成,照片和文字合成一張新的圖片。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);

整體就算完成了,剩下的自己研究,僅僅是一個方法,有很多可取代的方法,自行研究。學無止境。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39763.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39763.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39763.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Seal^_^【送書活動第8期】——《ChatGLM3大模型本地化部署、應用開發與微調》

Seal^_^【送書活動第8期】——《ChatGLM3大模型本地化部署、應用開發與微調》 一、參與方式二、本期推薦圖書2.1 作者建語2.2 編輯推建2.3 圖書簡介2.4 前 言2.5 目 錄 三、正版購買 大模型領域 既是繁星點點的未知宇宙,也是蘊含無數可能的廣闊天地, 正…

深入理解 Linux 內核架構

目錄 引言內核概念Linux 內核的基本組成 進程管理內存管理文件系統設備驅動網絡棧內核結構 內核態與用戶態內核模塊系統調用中斷與異常處理內核同步機制Linux 內核使用場景常用的內核命令與工具內核調試與性能優化總結 1. 引言 Linux 內核是現代計算機系統的核心組件之一&am…

python--基礎知識點--協程

協程由用戶態控制,不由內核控制1個線程中可以開很多協程協程切換是在用戶態控制不由內核控制,切換時資源開銷小使用方式:async def、await可等待對象(協程對象、Future對象、task對象(是Future對象的子類)->io等待)、事件循環使用場景&…

idea創建自定義的maven spark scala archetype腳手架

一:先創建一個Maven項目net.alchim31.maven(選該模板,得要等一會兒才能加載出來) 之后將自己的目錄結構建立好,最好不要有空目錄,可能會因為沒有文件在install的時候編譯不進去 pom中內容也按照自己的需要改…

Stable Diffusion web UI 插件

2024.7.3更新,持續更新中 如果需要在linux上自己安裝sd,參考:stable diffusion linux安裝 插件復制到 /stable-diffusion-webui/extensions 目錄下,然后重新啟動sd即可 一、插件安裝方法 每種插件的安裝方法可能略有不同&#xf…

蘋果p12證書最簡單最新申請流程

使用uniapp打包,在ios上打正式包需要蘋果的p12證書和證書profile文件,點進去uniapp的ios證書申請教程,通篇就是使用mac電腦申請的教程,假如沒有mac電腦就無法繼續了。 因此,假如沒有mac電腦的同志們,可以參…

高薪程序員必修課-Java中為什么不建議使用Executors來創建線程池?

目錄 前言 原因分析 1. newFixedThreadPool 和 newSingleThreadExecutor 示例: 2. newCachedThreadPool 示例: 建議的替代方法 示例: 解釋: 總結 前言 在Java中,Executors 類提供了幾個工廠方法來創建不同類型…

RAG開源項目Qanything源碼閱讀3-在線推理

原文:前沿重器[47] | RAG開源項目Qanything源碼閱讀3-在線推理 項目:https://github.com/netease-youdao/QAnything 第一篇:RAG開源項目Qanything源碼閱讀1-概述服務 第二篇:RAG開源項目Qanything源碼閱讀2-離線文件處理 0&#x…

Pytest+Allure+Yaml+PyMsql+Jenkins+Gitlab接口自動化(五)Jenkins配置

一、背景 Jenkins(本地宿主機搭建) 拉取GitLab(服務器)代碼到在Jenkins工作空間本地運行并生成Allure測試報告 二、框架改動點 框架主運行程序需要先注釋掉運行代碼(可不改,如果運行報allure找不到就直接注釋掉) …

中英雙語介紹美國的州:路易斯安那州(Louisiana)

中文版 路易斯安那州簡介 路易斯安那州位于美國南部,以其豐富的歷史文化、多樣的自然景觀和獨特的音樂和美食傳統而聞名。以下是對路易斯安那州的詳細介紹,包括其地理位置、人口、經濟、教育、文化和主要城市。 地理位置 路易斯安那州東臨密西西比州…

鴻蒙應用開發-時間屏幕

點擊下載源碼: https://download.csdn.net/download/liuhaikang/89509449 做一個時間屏幕,可以點擊切換白色和黑色,有漸變效果,使用到了鴻蒙的動畫效果。 在這個設計中,我們首先引入了通用能力包,以實現功…

Kubernetes 離線安裝的坑我采了

Kubernetes 離線安裝的坑我采了 一、Error from server: Get "https://xx.xx.xx.xx:10250/containerLogs/kube-system/calico-node-8dnvs/calico-node": tls: failed to verify certificate: x509: certificate signed by unknown authority二、calico 或 pod 啟動正…

cesium公交車軌跡漫游

個人博客:CSDN 博客-滿分觀察網友 z 演示地址:嗶哩嗶哩-滿分觀察網友 z 這是一個用 Cesium.js 做的公交車軌跡漫游,實現的功能有加載站點和道路軌跡點數據、監聽車輛的實時位置、車輛控制器。滾動屏等等。 文章目錄 1. 地圖初始化2. 數據渲…

【高中數學/基本不等式】已知:x,y均為正實數,且xy+2x+y=4 求:x+y的最小值?

【問題】 已知:x,y均為正實數,且xy2xy4 求:xy的最小值? 【來源】 https://www.ixigua.com/7147585275823292942?logTagf25494de7fce23a3a3d0 【解答】 解: 由xy2xy4 兩邊加二得 xy2xy24 2 分解因式得 (x1)(…

0090__【Git系列】merge和rebase的區別

【Git系列】merge和rebase的區別_rebase和merge的區別-CSDN博客 git中rebase和merge的區別是什么-git-PHP中文網 https://blog.51cto.com/qzcsbj/9444199

從零搭建教育管理系統:Java + Vue.js 教學-02

第三步:創建實體類和 Mapper 接口 現在我們已經設計好了數據庫表,接下來使用 MyBatis-Plus 將這些表映射到 Java 對象,以便在代碼中輕松地進行操作。 1. 創建實體類 在 src/main/java/<your_package>/entity 目錄下 (如果沒有該目錄,請手動創建),創建與數據庫表對應…

MyBatis(20)MyBatis 事務管理如何實現

MyBatis 的事務管理是通過底層 JDBC 連接的事務管理機制來實現的。事務管理對于任何涉及多個數據庫操作的應用程序來說都是至關重要的&#xff0c;它確保數據的一致性和完整性。在 MyBatis 中&#xff0c;事務管理可以通過 SQL 會話&#xff08;SqlSession&#xff09;來實現。…

【WEB前端2024】3D智體編程:喬布斯3D紀念館-第53課-語音指令跳舞

【WEB前端2024】3D智體編程&#xff1a;喬布斯3D紀念館-第53課-語音指令跳舞 使用dtns.network德塔世界&#xff08;開源的智體世界引擎&#xff09;&#xff0c;策劃和設計《喬布斯超大型的開源3D紀念館》的系列教程。dtns.network是一款主要由JavaScript編寫的智體世界引擎&…

可信計算的完整專用名詞列表

可信計算的完整專用名詞列表 Trusted Computing - 可信計算Trusted Platform Module (TPM) - 可信平臺模塊Hardware Root of Trust - 硬件根信任Secure Boot - 安全啟動Remote Attestation - 遠程證明Integrity Measurement - 完整性度量Measurement Log - 度量日志Attestatio…

Android 圖像效果的奧秘

在當今數字化時代&#xff0c;圖像已經成為人們生活和工作中不可或缺的一部分。而在 Android 系統中&#xff0c;圖像效果的應用更是豐富多彩&#xff0c;為用戶帶來了更加出色的視覺體驗。本文將深入探討 Android 圖像效果的原理、實現方法以及應用場景&#xff0c;幫助讀者更…