绘制验证码类
<?php
class Captcha {
const CODE_LENGTH = 4;
const LINE_COUNT = 4;
const DOT_COUNT = 200;
static $CANDIDATES = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public function __construct($width, $height) {
$this->width = $width;
$this->height = $height;
$this->image = imagecreatetruecolor($width, $height);
$this->generateCaptchaCode();
}
public function __destruct() {
imagedestroy($this->image);
}
public function paint() {
$this->paintBackground();
$this->paintText();
$this->paintDirty();
}
public function output() {
header('Content-Type: image/png');
imagepng($this->image);
}
public function code() {
return $this->code;
}
private function paintBackground() {
$color = imagecolorallocate($this->image, 255, 255, 255);
imagefill($this->image, 0, 0, $color);
}
private function paintText() {
for ($i = 0; $i < strlen($this->code); ++$i) {
$fontsize = 6;
$color = imagecolorallocate($this->image, rand(0,50), rand(0,50), rand(0,50));
$x = ($i * 100 / self::CODE_LENGTH) + rand(5, 10);
$y = rand(5, 10);
imagestring($this->image, $fontsize, $x, $y, $this->code[$i], $color);
}
}
private function paintDirty() {
for ($i = 0; $i < self::DOT_COUNT; ++$i) {
$pointcolor = imagecolorallocate($this->image, rand(100,200), rand(100,200), rand(100,200));
imagesetpixel($this->image, rand(1,99), rand(1,29), $pointcolor);
}
for ($i = 0; $i < self::LINE_COUNT; $i++) {
$linecolor = imagecolorallocate($this->image, rand(100,200), rand(100,200), rand(100,200));
imageline($this->image, rand(1,$this->width-1), rand(1,29), rand(1,99), rand(1,29), $linecolor);
}
}
private function generateCaptchaCode() {
for ($i = 0; $i < self::CODE_LENGTH; ++$i) {
$len = strlen(self::$CANDIDATES);
$pos = rand(0, $len - 1);
$ch = self::$CANDIDATES[$pos];
$this->code .= $ch;
}
}
private $image = NULL;
private $code = "";
private $width = 0;
private $height = 0;
}
?>
绘制图片页面
<?php
session_start();
require_once "./Captcha.php";
$captcha = new Captcha(100, 30);
$_SESSION['captcha'] = $captcha->code();
$captcha->paint();
$captcha->output();
?>
表单页面
<?php
session_start();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>提交页面</title>
<script>
function validate_form(form) {
with (form) {
if (captcha.value == null || captcha.value == "") {
alert("验证码不能为空!");
return false;
}
}
return true;
}
</script>
</head>
<body>
<form method="post" action="./validate.php" onsubmit="return validate_form(this)">
验证码:<input type="text" name="captcha" value="" size=10>
<img title="点击刷新" id="captchaImg" border="1" src="./captchaImage.php"
onclick="this.src='./captchaImage.php?r=' + Math.random();"></img><br>
<input type="submit"/>
</form>
</body>
</html>
验证页面
<?php
session_start();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>验证页面</title>
</head>
<body>
<?php
if (isset($_POST['captcha']) && strcasecmp($_POST['captcha'], $_SESSION['captcha']) == 0) {
echo "Succeeded!";
} else {
ec`
o "Failed!";
}
?>
</body>
</html>
运行结果
查看运行结果