为了账号安全,请及时绑定邮箱和手机立即绑定

请各位帮我看看怎么回事,图片显示是破裂的

<?php 

require_once 'string.func.php';

//通过GD库做验证码

//创建画布

session_start();

$width=80;

$height=28;

// 新建一个真彩色图像 

$image=imagecreatetruecolor($width,$height);

//为一幅图像分配颜色 

$white=imagecolorallocate($image,255,255, 255);

//为一幅图像分配颜色 

$black=imagecolorallocate($image, 0, 0,0);

//画一矩形并填充 

imagefilledrectangle($image, 1, 1, $width-2, $height-2, $black);

$type=1;

$length=4;

$chars=buildRandomString($type,$length);

$sess_name="verify";

$_SESSION[$sess_name]=$chars;

$fontfiles=array('MSYH.TTF');

for($i=0;$i<$length;$i++){

$size=mt_rand(14,18);

$angle=mt_rand(-15,15);

$x=5+$i*$size;

$y=mt_rand(20,26);

$fontfile="../fonts".$fontfiles[mt_rand(0,count($fontfiles)-1)];

$text=substr($chars,$i,1);

// 用 TrueType 字体向图像写入文本 

    imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);

}

header("content-type:image/gif");

imagegif($image);

imagedestroy($image);





<?php 

function buildRandomString($type=1,$length=4){

if($type==1){

    $chars=join("",range(0,9));

}

elseif($type==2){

    $chars=join("",array_merge(range("a","z"),range("A","Z")));

}

elseif($type==3){

    $chars=join("",array_merge(range("a","z"),range("A","Z"),range(0,9)));

}

if($length>strlen($chars)){

    exit("字符串长度不够");

}

$chars=str_shuffle($chars);

return substr($chars,0,$length);

}


正在回答

1 回答

我帮你改好了,运行没问题。

你的问题是:

  1. imagettftext()方法第7个参数$color,是未知的,他需要一个颜色来设置字体颜色,所以在这个这个方法之前先用$color = imagecolorallocate();生成一个颜色。

  2. 你把这句$fontfile="../fonts".$fontfiles[mt_rand(0,count($fontfiles)-1)];放在循环里面,不建议这么做,虽然没问题,但如果代码运算庞大的话会耗费更多资源,建议放到for外面去。这倒不是严重问题,组要是下面。

    你的这句:$fontfile="../fonts".$fontfiles[mt_rand(0,count($fontfiles)-1)];中“../fonts”之后没有加上目录字符“/”,这样字符拼接起来的时候会是这样的"../fontsMSYH.TTF",应该修改成这样:$fontfile="../fonts/".$fontfiles[mt_rand(0,count($fontfiles)-1)]; 

    然后拼接后的字符是这样才是正确的"../fonts/MSYH.TTF"。

    下面是改好的代码:

<?php 
require_once 'string.func.php';
//通过GD库做验证码
//创建画布
session_start();
$width=80;
$height=28;
// 新建一个真彩色图像 
$image=imagecreatetruecolor($width,$height);
//为一幅图像分配颜色 
$white=imagecolorallocate($image,255,255, 255);
//为一幅图像分配颜色 
$black=imagecolorallocate($image, 0, 0,0);
//画一矩形并填充 
imagefilledrectangle($image, 1, 1, $width-2, $height-2, $black);
$type=1;
$length=4;
$chars=buildRandomString($type,$length);
$sess_name="verify";
$_SESSION[$sess_name]=$chars;
$fontfiles=array('MSYH.TTF');

//放到for外面,fonts之后要加"/"
// 用 TrueType 字体向图像写入文本 
$fontfile="../fonts/".$fontfiles[mt_rand(0,count($fontfiles)-1)];

for($i=0;$i<$length;$i++){
	$size=mt_rand(14,18);
	$angle=mt_rand(-15,15);
	$x=5+$i*$size;
	$y=mt_rand(20,26);
	$text=substr($chars,$i,1);
	//产生一个用于填充字体的随机颜色
	$color = imagecolorallocate($image, mt_rand(50, 90), mt_rand(80, 200), mt_rand(90, 180));
    
    imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);
}
header("content-type:image/gif");
imagegif($image);
imagedestroy($image);


0 回复 有任何疑惑可以回复我~
#1

熊猫的家园 提问者

谢谢你,我试试看
2016-11-16 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
手把手教你实现电商网站后台开发
  • 参与学习       117283    人
  • 解答问题       1999    个

手把手教你用PHP搭建电子商务平台,由浅入深教你搭建电商系统

进入课程

请各位帮我看看怎么回事,图片显示是破裂的

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信