PHP7中文手册2018 带注释 最新chm版
先上两组图,对比下效果。
【整容前】
【整容后】
通过对比可以发现,修改前,验证码字号小,且颜色与干扰线相同。当干扰先过密时,不易识别;修改后这些写问题都解决了。虽然以前有人说过我审美有问题,但我觉得,这次应该没出错,还是修改后的好看。
改动不是很大,主要有三点:
1. 生成干扰之前,除了文字颜色,再用同样的方法随机生成另外两个颜色(因为是随机,所以颜色很大几率会不同),用作干扰线和杂点的颜色,这样就可以把文字的颜色和其他的东西区分开;
2. 在function开的时候,定义一个$fontPath,存储字体文件的路径,然后在相应的路径下拷进去一个字体文件;
3. 最关键的一步:生成图片内容时,用imagettftext函数代替imagestring,就同时解决了字号和字体的问题。imagestring的参数,可以问度娘。在此不得不多一句嘴:百度真的是最好的老师,古今中外、天文地理、人文科学、岛国欧美,你问啥,她答啥~
最后来道硬菜,上代码(红色是修改过的部分):
/**
* 生成图像验证码
* @static
* @access public
* @param string $length 位数
* @param string $mode 类型
* @param string $type 图像格式
* @param string $width 宽度
* @param string $height 高度
* @return string
*/
static function buildImageVerify($length=4, $mode=1, $type='png', $width=48, $height=22, $verifyName='verify')
{
import('ORG.Util.String');
$fontPath=THINK_PATH."/Common/consolab.ttf"; // 字体文件路径
$randval = String::randString($length, $mode);
session($verifyName, md5($randval));
$width = ($length * 10 + 10) > $width ? $length * 10 + 10 : $width;
if ($type != 'gif' && function_exists('imagecreatetruecolor'))
{
$im = imagecreatetruecolor($width, $height);
}
else
{
$im = imagecreate($width, $height);
}
$r = Array(225, 255, 255, 223);
$g = Array(225, 236, 237, 255);
$b = Array(225, 236, 166, 125);
$key = mt_rand(0, 3);
$backColor = imagecolorallocate($im, $r[$key], $g[$key], $b[$key]); //背景色(随机)
$borderColor = imagecolorallocate($im, 100, 100, 100); //边框色
imagefilledrectangle($im, 0, 0, $width - 1, $height - 1, $backColor);
imagerectangle($im, 0, 0, $width - 1, $height - 1, $borderColor);
// 原有的文字颜色
$stringColor = imagecolorallocate($im, mt_rand(0, 200), mt_rand(0, 120), mt_rand(0, 120));
// 干扰线颜色,与文字颜色一并随机生成,但可很大几率的保证颜色不同,方便识别
$disturbColor_line = imagecolorallocate($im, mt_rand(0, 200), mt_rand(0, 120), mt_rand(0, 120));
// 干扰点颜色,与文字颜色一并随机生成,但可很大几率的保证颜色不同,方便识别
$disturbColor_circle = imagecolorallocate($im, mt_rand(0, 200), mt_rand(0, 120), mt_rand(0, 120));
// 干扰
for ($i = 0; $i < 10; $i++)
{
imagearc($im, mt_rand(-10, $width), mt_rand(-10, $height), mt_rand(30, 300), mt_rand(20, 200), 55, 44, $disturbColor_line);
}
for ($i = 0; $i < 25; $i++)
{
imagesetpixel($im, mt_rand(0, $width), mt_rand(0, $height), $disturbColor_circle);
}
for ($i = 0; $i < $length; $i++)
{
// 替换原来的函数,生成图片时引入字体文件,美化样式
imagettftext($im,14,10,$i*10+5,mt_rand(16,26),$stringColor,$fontPath,$randval{$i});
/*imagestring($im, 5, $i * 10 + 5, mt_rand(1, 8), $randval{$i}, $stringColor);*/
}
Image::output($im, $type);
}
转载请注明:谷谷点程序 » ThinkPHP验证码的美化