2010年5月30日 星期日

PHP繪圖處理

這篇會寫到PHP實作圖像的部分
會寫一個 CAPTCHA的範例
提到的函式還有轉換數字到ASCII字元的chr()函式、rand()函式等

CAPTCHA是指確認使用者端是否為人類使用,而非機器人程式的測試
一般常見的圖像認證碼即是一例

CAPTCHA範例:
 首先實作一個隨機產生文字字串的程式

define('CAPTCHA_NUMBER', 5);
//generate the random pass-phrase
$pass_phrase = "";
for($i = 0; $i < CAPTCHA_NUMBER; i++){
  $pass_phrase .= chr(rand(97, 122));
}

chr()函式將數字轉換成相對應的ASCII字元,數字97會被轉換成'a'
rand()函式當然就是回傳隨機整數
回傳範圍可以設定在指定範圍,或者是o與內建常數RAND_MAX(server設定)內

接著就是要產生圖像

define('CAPTCHA_WIDTH', 100);
define('CAPTCHA_HEIGHT', 25);

//create the image, make black background
$img = imagecreatetruecolor(CAPTCHA_WIDTH, CAPTCHA_HEIGHT);

//set a white background with black text and gray graphics
$bg_color = imagecolorallocate($img, 255, 255, 255);  //white
$text_color = imagecolorallocate($img, 0, 0, 0);  //black
$graphic_color = imagecolorallocate($img, 64, 64, 64); //dark gray

//fill the background
imagefilledrectangle($img, 0, 0, CAPTCHA_WIDTH, CAPTCHA_HEIGHT, $bg_color);

//draw some random lines
for($i = 0, $i < 5, $i++){
  imageline($img, 0, rand() % CAPTCHA_HEIGHT, CAPTCHA_WIDTH,
            rand() % CAPTCHA_HEIGHT, $graphic_color);
}

//sprinkle in some random dots
for($i = 0, $i < 50, $i++){
  imagesetpixel($img, rand() % CAPTCHA_WIDTH, rand() % CAPTCHA_HEIGHT, $graphic_color);
}

//draw the pass-phrase string
imagettftext($img, 18, 0, 5,CAPTCHA_HEIGHT - 5, $text_color,
             'Courier New Bold.ttf', $pass_phrase);

//output the image as a PNG using a header
header("Content-type: image/phg");
imagepng($img);

//release the image  from memory
imagedestroy($img);

imagecreatetruecolor()函式在記憶體裡準備繪製用的空白圖像
imagefilledrectangle()可用來填滿它的顏色
回傳值是一個image identifier,通常是大多數GD繪圖函式需要的第一個參數

imagecolorallocate()是用來配色用的
第一個參數是image identifier,後面三個參數是RGB數值
imageline()函式的第2、3參數是線段起點
imagerectangle()會填滿顏色在參數裡所涵蓋的範圍

imagegettftext()可以用特定字體來繪製文字
使用時必須先將字體放置於伺服器上
字體檔通常具有.ttf副檔名
函式的座標位置是第一個字元的左下角
第2個參數是大小,第3個參數是字體角度,以逆時針方向計算
第4、5參數則是作標位置

imagepng()函式會將圖像輸出到client端的browser上
假如選擇直接創造圖象到記憶體中,而不是採取賦予檔名的方式
要呼叫header()函式幫助傳送到瀏覽器
如果要儲存圖像則在imagepng()函式裡面多加入參數
imagepng($img, $filename, 5);
$filename要輸入完整的路徑名稱,參數5代表壓縮程度中等
這樣就能夠寫入檔案到png檔
imagedestroy() 函式可以釋放記憶體空間
使用完畢之後就用imagedestroy($img);
成功清除會回傳true

沒提到的函式還有

imageellipse()是在這例子裡面沒有的畫圓函式
他的參數是中心點位置和寬度、高度,顏色用最後一個參數填入
imagefilledellipse()可以用來填滿它,接受的參數和圓函式相同

imagestring()函式則是用PHP的內建字體來繪製字串圖像
使用範例為 imagestring($img, 3, 75, 75, 'Sample', $color);
第2個參數是字體大小,範圍是1~5
第3、4函數是座標
imagestringup()類似imagestring(),參數也一樣
但顯示效果則是逆時針旋轉90度的直立輸出

接著寫一段html碼
<label for="verify">Verification:</label>
<input type="text" id="verify" name="verify" value="Enter the phrase" />
<img src="source.php" alt="Verification pass-phrase" />

圖片來源就修改下本篇的程式碼來接上即可

沒有留言:

張貼留言