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

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

下面是php程式碼:


header("content-type:image/jpeg"); // 送出JPG的header
$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
    文章標籤
    Augmented Reality AR
    全站熱搜

    danielhuang030 發表在 痞客邦 留言(1) 人氣()