2011-03-02 40 views
0

我正在創建一個驗證碼圖片(請不要提供預先製作的圖片)。gd library - 字體大小?

它給你打電話

$captcha = new captcha(); 
$captcha->size(30)->getImage(); 

這將字體大小設置爲30,然後生成驗證碼的能力。

我的問題是與大小。

我該如何計算圖像應該有多寬? 驗證碼有6個字符。 我以爲我只能做($size*6)+10使圖像足夠寬+給它一個5px填充每邊(文本居中),但顯然不是。


代碼

<?php 

session_start(); 

class captcha { 

    private $font = 'monofont.ttf'; 
    private $characters = '23456789bcdfghjkmnpqrstvwxyz'; 
    private $size = 30; 
    private $count = 6; 
    private $colors = array(
     'b' => array('r' => 0, 'g' => 0, 'b' => 0), 
     't' => array('r' => 200, 'g' => 200, 'b' => 200), 
     'n' => array('r' => 127, 'g' => 127, 'b' => 127) 
    ); 


    function count($count) { 
     $this->count = $count; 
     return $this; 
    } 

    function size($size){ 
     $this->size = $size; 
     return $this; 
    } 

    function characters($characters) { 
     $this->characters = $characters; 
     return $this; 
    } 

    function backgroundColor($red, $green, $blue){ 
     $this->colors['b']['r'] = $red; 
     $this->colors['b']['g'] = $green; 
     $this->colors['b']['b'] = $blue; 
     return $this; 
    } 

    function noiseColor($red, $green, $blue){ 
     $this->colors['n']['r'] = $red; 
     $this->colors['n']['g'] = $green; 
     $this->colors['n']['b'] = $blue; 
     return $this; 
    } 

    function textColor($red, $green, $blue){ 
     $this->colors['t']['r'] = $red; 
     $this->colors['t']['g'] = $green; 
     $this->colors['t']['b'] = $blue; 
     return $this; 
    } 

    function generateCode() { 
     $code = ''; 
     $i = 0; 
     while ($i < $this->count) { 
      $code .= strtoupper(substr($this->characters, mt_rand(0, strlen($this->characters) - 1), 1)); 
      $i++; 
     } 
     return $code; 
    } 

    function getWidth() { 
     return ($this->count * $this->size); 
    } 

    function getHeight() { 
     return $this->size+10; 
    } 


    function getCaptcha() { 

     $code = $this->generateCode(); 
     $this->width = $this->getWidth(); 
     $this->height = $this->getHeight(); 

     $image = @imagecreate($this->width, $this->height) or die('Cannot initialize new GD image stream'); 

     //define colors 
     $tColor = imagecolorallocate($image, $this->colors['t']['r'], $this->colors['t']['g'], $this->colors['t']['b']); 
     $nColor = imagecolorallocate($image, $this->colors['n']['r'], $this->colors['n']['g'], $this->colors['n']['b']); 
     $bColor = imagecolorallocate($image, $this->colors['b']['r'], $this->colors['b']['g'], $this->colors['b']['b']); 

     //fill image 
     imagefill($image, 0, 0, $bColor); 

     /* generate random dots in background */ 

     for ($i = 0; $i < ($this->width * $this->height)/3; $i++) { 

      imagefilledellipse($image, mt_rand(0, $this->width), mt_rand(0, $this->height), 1, 1, $nColor); 

     } 

     /* generate random lines in background */ 

     for ($i = 0; $i < ($this->width * $this->height)/150; $i++) { 

      imageline($image, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $nColor); 
     } 

     /* create textbox and add text */ 

     $textbox = imagettfbbox($this->size, 0, $this->font, $code) or die('Error in imagettfbbox function'); 

     $x = ($this->width - $textbox[4])/2; 

     $y = ($this->height - $textbox[5])/2; 

     imagettftext($image, $this->size, 0, $x, $y, $tColor, $this->font, $code) or die('Error in imagettftext function'); 
     //imagefilter($image, IMG_FILTER_NEGATE); 
     imagefilter($image, IMG_FILTER_SMOOTH, 1); 

     /* output captcha image to browser */ 

     header('Content-Type: image/jpeg'); 

     header('Cache-Control: no-cache, must-revalidate'); 

     imagejpeg($image); 

     imagedestroy($image); 

     $_SESSION['security_code'] = $code; 

    } 
} 

$captcha = new captcha(); 
$captcha->size(30)->count(6)->getCaptcha(); 

?> 
+0

你能澄清爲什麼不能? – Dan 2011-03-02 03:40:46

+0

生病後的代碼,所以你可以嘗試自己:) – Hailwood 2011-03-02 03:47:03

回答

0

您可以使用imagegetttfbbox()來確定邊界框可以包含你的字符串。但是,由於您正在生成驗證碼,這意味着角色非常偏愛,所以我認爲它不會特別準確。它用於常規未更改的文本。

+0

文本不會被扭曲(很多),只是在背景中分心和模糊的文字 – Hailwood 2011-03-02 03:56:50