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:表示字体的颜色
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
②使用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" "this.src = 'CheckProcess.php?rand='+Math.random()" name="check_img" width="60px" height="20px" align="center" />
</body>
</html>