close

 

[PHP] 利用GD函式庫,製作互動式圖片 

很久以前就有這樣的計畫,利用現有的圖片由使用者自行加註文字,然後合成為另一張新的圖片~爬了一下PTTPHP版,很快就看到類似的東西。剛好十天的假期在家閒閒沒事,就來研究一下這玩意兒要怎麼弄吧。

說到跟圖片有關的東西,就不能忘了PHPGD函式庫啦!它強大的功能也曾經幫我在名片查詢系統時,利用PHP上傳名片圖檔的時候同步縮小圖片呢~這次運用到的函數是ImageTTFText,它可以利用自備的TrueType字體檔,寫入文字到圖形中。最近我對微軟正黑體還蠻有好感的,再加上它算是一套免費(由微軟官方釋出,不過好像是不能任意提供給人家下載啦)的字體;拿來當圖片用的字型,在適合不過啦!

下面是php程式碼:

header("content-type:image/jpeg"); //
送出JPGheader
$nimage=imagecreatetruecolor(1024,729); //
建立一個寬 1024 729 像素的圖片
$black=imagecolorallocate($nimage,0,0,0); //
設定文字顯示RGB顏色
$simage =ImageCreateFromJPEG('card2008.jpg'); //
利用ImageCreateFromJPEG函數讀取原始圖片
imagecopy($nimage,$simage,0,0,0,0,1024,729); //
利用imagecopy函數複製原始圖片到建立的新圖片上
$font = '/xxx/xxx/xxx.TTF'; //
字形路徑設定
ImageTTFText($nimage,26,0,60,570,$black,$font,$wish_word); //
利用ImageTTFText函數將文字合併於圖片
ImageJPEG($nimage); //
輸出JPEG圖片
imagedestroy($nimage);
imagedestroy($simage); //
釋放之前暫存圖片的記憶體

當然,重點是在ImageTTFText函數的用法:

ImageTTFText($nimage,26,0,60,570,$black,$font,$wish_word); 

$nimage
:新建立的圖片的變數名
26
:字型的大小
0
:字型的角度
60
X座標軸位置
570
Y座標軸位置
$black
:字型顏色
$font
:字體檔位置;這邊因為我架設主機的平台是linux,不知道為什麼相對位置整個沒反應。弄了好久最後用絕對位置搞定,所以要特別注意。
$wish_word
:輸出於圖片上的話

另外因為輸出字數的問題也花了我一點時間...
因為ImageTTFText不會自動幫你斷行,所以必須自己加『\n』去斷行
UTF-8
的編碼方式中文字是3個字元,解決方法就是自己算字數然後加『\n』:

if(strlen($wish_words) > (26*3) and (strlen($wish_words) < (26*3*3+1))){
   for($i=0;$i<floor(strlen($wish_words)/78);$i++){
    $wish_word .= substr($wish_words,($i*78),78)."\n";
   }
}

我設定在字數多於26個字時斷行
其中floor()函數是取小數點後無條件捨去的正整數,另一個ceil()函數則是無條件進位後的正整數
這裡我使用floor()函數
substr()
函數擷取我要的字段後在自己加『\n』斷行

其實我來以為這只是一個很簡單的GD函數運用,可是因為字型檔路徑跟編碼問題還是讓我花了不少時間
成功了以後又覺得怎麼那麼簡單?
所以雖然函數就在那,但還是要用過才知道用法,才知道會碰到什麼問題,要怎麼解決!

因為從前年開始,我每年都會為PTT的資科系版畫新年賀圖
今年就想利用這個賀圖結合一些祝福的話,在除夕夜的簡訊中連同網址一起發出
所以才會心血來潮的想做這玩意兒;本來以為簡單的東西,其實還是花了不少時間。
這裡是成果,祝大家新年快樂^^

arrow
arrow
    全站熱搜

    avrilnote 發表在 痞客邦 留言(0) 人氣()