PHP生成验证码时“图像因其本身有错无法显示”的解决方法

发布时间:2020-11-09编辑:脚本学堂
php在生成验证码时,总提示如下的错误:图像因其本身有错无法显示,如何解决这个问题呢?请看本文的详细介绍。

网上大部分的解决方法都是:“<?”这句代码前的空格回车一切都删掉以防止有html输出,但这根本解决不了问题,后来看到有人在Header("Content-type: image/PNG");这句代码前使用ob_clean()清除输出,经测试可用。

把用到的代码分享出来,有需要的朋友,可以参考下。

1、确认码生成文件 checkNum_session.php
 

复制代码 代码示例:
<?php
Header("Content-type: image/png"); 
/*
* 初始化
*/ 
$border = 1; //是否要边框 1要:0不要 
$how = 4; //验证码位数 
$w = $how*15; //图片宽度 
$h = 20; //图片高度 
$fontsize = 6; //字体大小 
$alpha = "abcdefghijkmnopqrstuvwxyz"; //验证码内容1:字母 
$number = "023456789"; //验证码内容2:数字 
$randcode = ""; //验证码字符串初始化 
srand((double)microtime()*1000000); //初始化随机数种子 
$im = ImageCreate($w, $h); //创建验证图片 
/*
* 绘制基本框架
*/ 
$bgcolor = ImageColorAllocate($im, 255, 255, 255); //设置背景颜色 
ImageFill($im, 0, 0, $bgcolor); //填充背景色 
if($border) 

$black = ImageColorAllocate($im, 0, 0, 0); //设置边框颜色 
ImageRectangle($im, 0, 0, $w-1, $h-1, $black);//绘制边框 

/*
* 逐位产生随机字符
*/ 
for($i=0; $i<$how; $i++) 
{
$alpha_or_number = mt_rand(0, 1); //字母还是数字 
$str = $alpha_or_number ? $alpha : $number; 
$which = mt_rand(0, strlen($str)-1); //取哪个字符 
$code = substr($str, $which, 1); //取字符 
$j = !$i ? 4 : $j+15; //绘字符位置 
$color3 = ImageColorAllocate($im, mt_rand(0,100), mt_rand(0,100), mt_rand(0,100)); //字符随即颜色 
ImageChar($im, $fontsize, $j, 3, $code, $color3); //绘字符 
$randcode .= $code; //逐位加入验证码字符串 

//把验证码字符串写入session 
session_start(); 
$_SESSION['authnum_session'] = $randcode; 
/*
* 添加干扰
*/ 
for($i=0; $i<1; $i++)//绘背景干扰线 
{
$color1 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); //干扰线颜色 
ImageArc($im, mt_rand(-5,$w), mt_rand(-5,$h), mt_rand(20,300), mt_rand(20,200), 55, 44, $color1); //干扰线 
}
for($i=0; $i<$how*40; $i++)//绘背景干扰点 
{
$color2 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); //干扰点颜色  
ImageSetPixel($im, mt_rand(0,$w), mt_rand(0,$h), $color2); //干扰点 

//关键代码,防止出现'图像因其本身有错无法显示'的问题 
ob_clean(); 
/*绘图结束*/ 
Imagegif($im); 
ImageDestroy($im); 
/*绘图结束*/ 

2、确认码调用文件 sessionValidate.php
 

复制代码 代码示例:
<?php 
session_start(); 
//在页首先要开启session, 
//error_reporting(2047); 
session_destroy(); 
//将session去掉,以每次都能取新的session值; 
//用seesion 效果不错,也很方便 
?> 
<html> 
<head> 
<title>session 图片验证实例</title> 
</head>  
<body>  
此例为session验证实例 
<form action="" method="post"> 
验证码:<input type="text" name="validate" value="" size=10> <img src="checkNum_session.php"><br> 
<input type="submit"> 
</form> 
<?php 
//打印上一个session; 
echo "上一个session:<b>".$_SESSION["authnum_session"]."</b><br>"; 
$validate=""; 
if(isset($_POST["validate"])){ 
$validate=$_POST["validate"]; 
echo "您刚才输入的是:".$_POST["validate"]."<br>状态:"; 
if($validate!=$_SESSION["authnum_session"]){ 
//判断session值与用户输入的验证码是否一致; 
echo "<font color=red>输入有误</font>";  
}else{ 
echo "<font color=green>通过验证</font>";  

}  
/*
//打印全部session;
PrintArr($_SESSION);
function PrintArr($aArray){
echo '<xmp>';
print_r($aArray);
echo '</xmp>';
}
*/ 
?>