前言
無論是自己要在精心P過的自拍上添加個性文字,或者是攝影愛好者要在拍攝的作品裡添加浮水印,亦或是在網頁或者行動裝置 App中即時產生文字和圖片的組合,我們都需要找到一個合適且靠譜的方法來將圖片和文字完美的結合在一起。
所以,“最好的程式設計語言”PHP及其GD庫就給我們提供了這樣一套簡單且高效的解決方案。
我知道,這時候有個執行個體才是最好的~ 下面就讓我來舉個簡單的栗子!
目標
將使用者在網頁應用中輸入的個人資訊與圖片結合,產生一張印有使用者資訊的名片。
效果
1 預設一張圖片,作為名片背景
名片背景
2 使用者資訊輸入
資訊輸入
3 名片產生(點擊Continue之後)
名片產生
步驟
在一切開始之前,請使用phpinfo() command
來確認GD庫已安裝。
首先,我們要做的事情很簡單,建立一個PHP檔案,就叫它main.php吧。
在main.php中,理論上我們需要以下幾行代碼(本代碼基於CakePHP 3):
<?php//建立一個表單提供使用者輸入功能echo $this->Form->create();//只保留value屬性,其他屬性已省略echo $this->Form->input('First Name',['value' => $firstname, '...' => '...', ...]);echo $this->Form->input('Last Name',['value' => $lastname, '...' => '...', ...]);echo $this->Form->input('City',['value' => $city, '...' => '...', ...]);echo $this->Form->input('State',['value' => $state, '...' => '...', ...]);/** 將img標籤指向一個叫做image.php的PHP檔案。 * 所有的使用者輸入資訊將以URL的形式儲存在img標籤的src屬性中, * 在表格提交後即可被image.php通過GET擷取。* 所有變數已通過PHP內建strtoupper函數轉換為大寫。*/echo $this->Html->image("image.php?first=".strtoupper($firstname)."&last=".strtoupper($lastname)."&location=".strtoupper($city)." ".strtoupper($state), ['fullBase' => true]);/** 上面的代碼相當於:* <img src="image.php?first=名&last=姓&location=城市" />*///表單提交echo $this->Form->button('CONTINUE', ['type' => 'submit']); //關閉表單$this->Form->end();
接下來,就是建立Where amazing happens的image.php了。包括圖片設定,擷取使用者資訊,將文字資訊添加到圖片上,所有的一切都將在這一步完成。
讓我們通過代碼來一探究竟吧。
<?php// header() 函數向用戶端發送原始的 HTTP 前序。header('Content-type: image/jpeg');// 由檔案或 URL 建立一個新圖象,這裡的text.jpg就是效果1顯示的預設圖片$rImg = ImageCreateFromJPEG("test.jpg"); // 為一幅映像分配顏色$cor = imagecolorallocate($rImg, 0, 0, 0);// 我們可以自訂與圖片結合的文字字型$font = "./arial.ttf";// 設定最終產生圖片的寬度以及文字相對於圖片所在的高度$imgWidthSetting = 676;$textHeightOffset = 220;// 解碼main.php裡img標籤已編碼的URL字串,包括first, last以及location$first = urldecode($_GET['first']);$last = urldecode($_GET['last']);$location = urldecode($_GET['location']);/** 取得需要向圖片上添加的文本的範圍。imagettfbbox() 返回一個含有8個* 單元的數組表示了文本外框的四個角。*/$width_first = imagettfbbox(60, 0, $font, $first);$width_last = imagettfbbox(70, 0, $font, $last);$width_location = imagettfbbox(35, 0, $font, $location);// 進一法取整, $width_變數[2]代表右下角X座標位置$x_first = ceil($imgWidthSetting - $width_first[2]);$x_last = ceil($imgWidthSetting - $width_last[2]); $x_location = ceil($imgWidthSetting - $width_location[2]);// 利用imagettftext()函數將文本“寫入”映像imagettftext($rImg, 60, 0, $x_first, $textHeightOffset+120, $cor, $font, $first);imagettftext($rImg, 70, 0, $x_last, $textHeightOffset+210, $cor, $font, $last);imagettftext($rImg, 35, 0, $x_location, $textHeightOffset+290, $cor, $font, $location);// 輸出圖象到瀏覽器或檔案,quality 為可選項,範圍從 0(最差品質,檔案更小)到 100(最佳品質,檔案最大)imagejpeg($rImg,NULL,100); // Free up memory, imagedestroy() 釋放與 image 關聯的記憶體。imagedestroy($rImg);
到這裡,我們就完成了通過PHP把文字添加到圖片上的所有步驟。當使用者輸入個人資訊並提交表單後,通過image.php,效果3的名片就會自動產生。
總結
利用PHP將文字與圖片結合雖然簡單,但可以衍生出很多不同的應用方法。譬如,我們可以將名片背景及產生的名片隱藏起來,只對使用者顯示資訊輸入介面。同時,我們在代碼中接入印表機的API。這樣,當使用者輸入完自己的資訊點擊繼續之後,顯示著使用者資訊的名片就會直接列印出來。這很適用於使用者參加線下聚會活動check in時的情境。
總之,PHP作為“最好的程式設計語言”,編碼不統一,效能遭詬病,文法不嚴謹。的確,PHP的槽點太多,足夠我們黑三天三夜。但我們又必須承認,PHP及其龐大的內建函數庫為網頁開發人員們提供了便捷且強有力的工具。你看,簡單的幾個函數,就可以完美實現文字與圖片的結合,所以PHP還是有很多人支援的。希望本文對大家學習PHP有所協助。