PHP中使用image绘制验证码遇到的有关字体情况
1.php中在画布中添加想要的内容(字符)
有两种方式:
①使用imagestring()函数,该函数的原型在官方文档中是这样写的:
bool imagestring ( resource $image , int $font , int $x , int $y , string $s , int $col )
对其中的参数说明:
- $image:该参数就是创建的画布变量
- $font:官方文档中说明了,如果该参数值是1,2,3,4或5,则使用内置字体。同时我检测了下,如果超过了5数值,绘制在画布上的字符的大小也是不会变化的
- x,x,x,y:这两个参数代表的是绘制的第一个字符应该出现在画布的什么位置,如果为0,0,则代表绘制的位置是在画布的左上角。
- $s:这个参数表示的是要绘制在画布上的字符串
- $col:表示字体的颜色
②使用imagefttext函数:
array imagefttext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text [, array $extrainfo ] )
对其中的参数说明:
- $image:该参数代表画布变量;
- $size:该参数代表绘制在画布上的字符串大小,注:这个变量是按照像素来设置的;
- $angle:该变量代表的是要绘制的字符串在画布上的旋转显示,值是0-360,当是0的时候就是平行显示,当为180的时候,字符串就是逆着显示的,旋转方向是逆时针旋转;
- x,x,x,y:字符串绘制的位置;
- $color:字符串的绘制颜色
- $fontfile:使用的字体路径
- $text:要绘制的字符串
- $extrainfo:可选变量,个人还没有理解这个变量的作用。各位看官知道的告我一声。
2.选择imagefttext函数的原因:
在绘制验证码的使用,刚开始是使用imagestring函数,但测试的时候发现这个函数的字体绘制出来的字符尺寸有点小,后来才使用了imagefttext函数,这个函数可以根据自己的需要设置不用的字体,还有字体的大小,以及旋转角等,功能相对还是丰富的。
3.在使用imgefttext过程中遇到的问题:
① 在设置参数fontfile的时候,刚开始我直接复制了window系统的字体到我写的demo文件夹中使用,可是在浏览器中却无法显示。上网查了写,有说需要在当前路径创建一个文件夹,将字体放进里面,然后再使用这个路径即可,测试了,还是不成功。
最后的解决办法是在网上下载了ttf类型的字体,同时这个字体的名字不能是中文,如果是中文一样也显示不出来。
4. 代码
① demo类:CheckCode.class.php
<?php
class CheckCode{
private $checkValue = "";
public function __construct(){
session_start();
}
public function setCheckImg(){
$this->setCheckValue(); //创建验证的四个value
//imagestring
//创建画布
$image1 = imagecreatetruecolor(110, 30);
$red = imagecolorallocate($image1, 255, 255, 255);
//画干扰线
for($i=0;$i<20;$i++){
imageline($image1, rand(0,110), rand(0,30), rand(0,110), rand(0,30), imagecolorallocate($image1, rand(0,255), rand(0,255), rand(0,255)));
}
imagefttext($image1,20,0,rand(20,80),rand(15,25),$red,"./hwst.TTF",$this->checkValue);
// imagestring($image1, 20, rand(0,80), rand(0,20), $this->checkValue, $red);
header("content-type:image/png");
imagepng($image1);
imagedestroy($image1);
}
/**
* 功能描述:设置要验证的四个value
*/
private function setCheckValue(){
for($i=0;$i<4;$i++){
$this->checkValue.=dechex(rand(1,15));
}
}
/**
* 将产生的验证码存入session种
*/
private function storeSession(){
$_SESSION['checkValue'] = $this->checkValue;
}
/**
* @return mixed
* 获取session中验证码的数据,并将其作为返回值
*/
public function getSession(){
if(!empty($_SESSION['checkValue']))
return $_SESSION['checkValue'];
else
return false;
}
}
② 调用和使用该类的php文件:CheckProcess.php
<?php
require_once "CheckCode.class.php";
$checkcode = new CheckCode();
$checkcode->setCheckImg();
③ 显示验证码的php文件:demo.php
<html>
<body>
<img src="CheckProcess.php" onclick="this.src = 'CheckProcess.php?rand='+Math.random()" name="check_img" width="60px" height="20px" align="center" />
</body>
</html>