利用PHP自動(dòng)生成印有用戶信息的名片
前言
無論是自己要在精心P過的自拍上添加個(gè)性文字,或者是攝影愛好者要在拍攝的作品里添加水印,亦或是在網(wǎng)頁或者移動(dòng)應(yīng)用中實(shí)時(shí)生成文字和圖片的組合,我們都需要找到一個(gè)合適且靠譜的方法來將圖片和文字完美的結(jié)合在一起。
所以,“最好的編程語言”PHP及其GD庫就給我們提供了這樣一套簡單且高效的解決方案。
我知道,這時(shí)候有個(gè)實(shí)例才是最好的~ 下面就讓我來舉個(gè)簡單的栗子!
目標(biāo)
將用戶在網(wǎng)頁應(yīng)用中輸入的個(gè)人信息與圖片結(jié)合,生成一張印有用戶信息的名片。
效果
1 預(yù)設(shè)一張圖片,作為名片背景
名片背景
2 用戶信息輸入
信息輸入
3 名片生成(點(diǎn)擊Continue之后)
步驟
在一切開始之前,請使用phpinfo() command
來確認(rèn)GD庫已安裝。
首先,我們要做的事情很簡單,新建一個(gè)PHP文件,就叫它main.php吧。
在main.php中,理論上我們需要以下幾行代碼(本代碼基于CakePHP 3):
<?php //創(chuàng)建一個(gè)表單提供用戶輸入功能 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標(biāo)簽指向一個(gè)叫做image.php的PHP文件。 * 所有的用戶輸入信息將以URL的形式保存在img標(biāo)簽的src屬性中, * 在表格提交后即可被image.php通過GET獲取。 * 所有變量已通過PHP自帶strtoupper函數(shù)轉(zhuǎn)換為大寫。 */ echo $this->Html->image("image.php?first=".strtoupper($firstname)."&last=".strtoupper($lastname). "&location=".strtoupper($city)." ".strtoupper($state), ['fullBase' => true]); /* * 上面的代碼相當(dāng)于: * <img src="image.php?first=名&last=姓&location=城市" /> */ //表單提交 echo $this->Form->button('CONTINUE', ['type' => 'submit']); //關(guān)閉表單 $this->Form->end();
接下來,就是創(chuàng)建Where amazing happens的image.php了。包括圖片設(shè)置,獲取用戶信息,將文字信息添加到圖片上,所有的一切都將在這一步完成。
讓我們通過代碼來一探究竟吧。
<?php // header() 函數(shù)向客戶端發(fā)送原始的 HTTP 報(bào)頭。 header('Content-type: image/jpeg'); // 由文件或 URL 創(chuàng)建一個(gè)新圖象,這里的text.jpg就是效果1顯示的預(yù)設(shè)圖片 $rImg = ImageCreateFromJPEG("test.jpg"); // 為一幅圖像分配顏色 $cor = imagecolorallocate($rImg, 0, 0, 0); // 我們可以自定義與圖片結(jié)合的文字字體 $font = "./arial.ttf"; // 設(shè)置最終生成圖片的寬度以及文字相對于圖片所在的高度 $imgWidthSetting = 676; $textHeightOffset = 220; // 解碼main.php里img標(biāo)簽已編碼的URL字符串,包括first, last以及l(fā)ocation $first = urldecode($_GET['first']); $last = urldecode($_GET['last']); $location = urldecode($_GET['location']); /* * 取得需要向圖片上添加的文本的范圍。imagettfbbox() 返回一個(gè)含有8個(gè) * 單元的數(shù)組表示了文本外框的四個(gè)角。 */ $width_first = imagettfbbox(60, 0, $font, $first); $width_last = imagettfbbox(70, 0, $font, $last); $width_location = imagettfbbox(35, 0, $font, $location); // 進(jìn)一法取整, $width_變量[2]代表右下角X坐標(biāo)位置 $x_first = ceil($imgWidthSetting - $width_first[2]); $x_last = ceil($imgWidthSetting - $width_last[2]); $x_location = ceil($imgWidthSetting - $width_location[2]); // 利用imagettftext()函數(shù)將文本“寫入”圖像 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 為可選項(xiàng),范圍從 0(最差質(zhì)量,文件更?。┑?100(最佳質(zhì)量,文件最大) imagejpeg($rImg,NULL,100); // Free up memory, imagedestroy() 釋放與 image 關(guān)聯(lián)的內(nèi)存。 imagedestroy($rImg);
到這里,我們就完成了通過PHP把文字添加到圖片上的所有步驟。當(dāng)用戶輸入個(gè)人信息并提交表單后,通過image.php,效果3的名片就會(huì)自動(dòng)生成。
總結(jié)
利用PHP將文字與圖片結(jié)合雖然簡單,但可以衍生出很多不同的應(yīng)用方法。譬如,我們可以將名片背景及生成的名片隱藏起來,只對用戶顯示信息輸入界面。同時(shí),我們在代碼中接入打印機(jī)的API。這樣,當(dāng)用戶輸入完自己的信息點(diǎn)擊繼續(xù)之后,顯示著用戶信息的名片就會(huì)直接打印出來。這很適用于用戶參加線下聚會(huì)活動(dòng)check in時(shí)的場景。
總之,PHP作為“最好的編程語言”,編碼不統(tǒng)一,性能遭詬病,語法不嚴(yán)謹(jǐn)。的確,PHP的槽點(diǎn)太多,足夠我們黑三天三夜。但我們又必須承認(rèn),PHP及其龐大的內(nèi)置函數(shù)庫為網(wǎng)頁開發(fā)者們提供了便捷且強(qiáng)有力的工具。你看,簡單的幾個(gè)函數(shù),就可以完美實(shí)現(xiàn)文字與圖片的結(jié)合,所以PHP還是有很多人支持的。希望本文對大家學(xué)習(xí)PHP有所幫助。
相關(guān)文章
PHP實(shí)現(xiàn)防重復(fù)提交(防抖)的方法總結(jié)
當(dāng)涉及到處理表單提交或用戶點(diǎn)擊按鈕等操作時(shí),防抖(Debounce)是一種重要的技術(shù),它可以有效地防止不必要的重復(fù)操作,本文為大家整理了 PHP 中防抖的多種實(shí)現(xiàn)方法,需要的可以參考下2023-09-09php通過exif_read_data函數(shù)獲取圖片的exif信息
這篇文章主要介紹了php通過exif_read_data函數(shù)獲取圖片的exif信息,默認(rèn)情況下,PHP讀取圖片Exif信息模塊是不開啟的,我們需要先開啟這個(gè)模塊。開啟Exif模塊需要mbstring支持,這里就不詳細(xì)說明了,我們來先看下函數(shù)的用法2015-05-05PHP+JS實(shí)現(xiàn)文件分塊上傳的示例代碼
我們在上傳大文件時(shí),可能會(huì)由于服務(wù)器的原因?qū)е挛募蟼魇?,文件過大時(shí)由于服務(wù)器的配置或響應(yīng)事件過長導(dǎo)致上傳文件失敗,這時(shí)候我們可以將一個(gè)大的文件分為若干塊,然后分批次上傳到服務(wù)端。本文介紹了實(shí)現(xiàn)的方法,需要的可以參考一下2022-11-11php實(shí)現(xiàn)數(shù)字補(bǔ)零的方法總結(jié)
這篇文章給大家總結(jié)了關(guān)于php實(shí)現(xiàn)數(shù)字補(bǔ)零的方法以及相關(guān)代碼分享,有興趣的朋友們學(xué)習(xí)下。2018-09-09