php 验证码 中文扭曲,基于GD库的php验证码类且支持中英文字体、背景、干扰点线、扭曲等...

基于GD库的php验证码类(支持中英文字体、背景、干扰点线、扭曲.......) <?php

/*

* Captcha Class base on PHP GD Lib

* @author Design

* @version 1.0

* @copyright js8.in 2010

* @demo

* include('captchaClass.php');

* $captchaDemo=new Captcha();

* $captchaDemo->createImage();

*/

class Captcha

{

//@定义验证码图片高度

private $height;

//@定义验证码图片宽度

private $width;

//@定义验证码字符个数

private $textNum;

//@定义验证码字符内容

private $textContent;

//@定义字符颜色

private $fontColor;

//@定义随机出的文字颜色

private $randFontColor;

//@定义字体大小

private $fontSize;

//@定义字体

private $fontFamily;

//@定义背景颜色

private $bgColor;

//@定义随机出的背景颜色

private $randBgColor;

//@定义字符语言

private $textLang;

//@定义干扰点数量

private $noisePoint;

//@定义干扰线数量

private $noiseLine;

//@定义是否扭曲

private $distortion;

//@定义扭曲图片源

private $distortionImage;

//@定义是否有边框

private $showBorder;

//@定义验证码图片源

private $image;

//@Constructor 构造函数

public function Captcha()

{

$this->textNum = 4;

$this->fontSize = 16;

$this->fontFamily = 'c:\windows\fontsSIMYOU.ttf'; //设置中文字体,可以改成linux的目录

$this->textLang = 'en';

$this->noisePoint = 30;

$this->noiseLine = 3;

$this->distortion = false;

$this->showBorder = false;

}

//@设置图片宽度

public function setWidth($w)

{

$this->width = $w;

}

//@设置图片高度

public function setHeight($h)

{

$this->height = $h;

}

//@设置字符个数

public function setTextNumber($textN)

{

$this->textNum = $textN;

}

//@设置字符颜色

public function setFontColor($fc)

{

$this->fontColor = sscanf($fc, '#%2x%2x%2x');

}

//@设置字号

public function setFontSize($n)

{

$this->fontSize = $n;

}

//@设置字体

public function setFontFamily($ffUrl)

{

$this->fontFamily = $ffUrl;

}

//@设置字符语言

public function setTextLang($lang)

{

$this->textLang = $lang;

}

//@设置图片背景

public function setBgColor($bc)

{

$this->bgColor = sscanf($bc, '#%2x%2x%2x');

}

//@设置干扰点数量

public function setNoisePoint($n)

{

$this->noisePoint = $n;

}

//@设置干扰线数量

public function setNoiseLine($n)

{

$this->noiseLine = $n;

}

//@设置是否扭曲

public function setDistortion($b)

{

$this->distortion = $b;

}

//@设置是否显示边框

public function setShowBorder($border)

{

$this->showBorder = $border;

}

//@初始化验证码图片

public function initImage()

{

if (empty($this->width)) {

$this->width = floor($this->fontSize * 1.3) * $this->textNum + 10;

}

if (empty($this->height)) {

$this->height = $this->fontSize * 2;

}

$this->image = imagecreatetruecolor($this->width, $this->height);

if (empty($this->bgColor)) {

$this->randBgColor = imagecolorallocate($this->image, mt_rand(100, 255), mt_rand(100, 255), mt_rand(100, 255));

} else {

$this->randBgColor = imagecolorallocate($this->image, $this->bgColor[0], $this->bgColor[1], $this->bgColor[2]);

}

imagefill($this->image, 0, 0, $this->randBgColor);

}

//@产生随机字符

public function randText($type)

{

$string = '';

switch ($type) {

case 'en':

$str = 'ABCDEFGHJKLMNPQRSTUVWXY3456789';

for ($i = 0; $i < $this->textNum; $i++) {

$string = $string . ',' . $str[mt_rand(0, 29)];

}

break;

case 'cn':

for ($i = 0; $i < $this->textNum; $i++) {

$string = $string . ',' . chr(rand(0xB0, 0xCC)) . chr(rand(0xA1, 0xBB));

}

$string = iconv('GB2312', 'UTF-8', $string); //转换编码到utf8

break;

}

return substr($string, 1);

}

//@输出文字到验证码

public function createText()

{

$textArray = explode(',', $this->randText($this->textLang));

$this->textContent = join('', $textArray);

if (empty($this->fontColor)) {

$this->randFontColor = imagecolorallocate($this->image, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100));

} else {

$this->randFontColor = imagecolorallocate($this->image, $this->fontColor[0], $this->fontColor[1], $this->fontColor[2]);

}

for ($i = 0; $i < $this->textNum; $i++) {

$angle = mt_rand(-1, 1) * mt_rand(1, 20);

imagettftext($this->image, $this->fontSize, $angle, 5 + $i * floor($this->fontSize * 1.3), floor($this->height * 0.75), $this->randFontColor, $this->fontFamily, $textArray[$i]);

}

}

//@生成干扰点

public function createNoisePoint()

{

for ($i = 0; $i < $this->noisePoint; $i++) {

$pointColor = imagecolorallocate($this->image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));

imagesetpixel($this->image, mt_rand(0, $this->width), mt_rand(0, $this->height), $pointColor);

}

}

//@产生干扰线

public function createNoiseLine()

{

for ($i = 0; $i < $this->noiseLine; $i++) {

$lineColor = imagecolorallocate($this->image, mt_rand(0, 255), mt_rand(0, 255), 20);

imageline($this->image, 0, mt_rand(0, $this->width), $this->width, mt_rand(0, $this->height), $lineColor);

}

}

//@扭曲文字

public function distortionText()

{

$this->distortionImage = imagecreatetruecolor($this->width, $this->height);

imagefill($this->distortionImage, 0, 0, $this->randBgColor);

for ($x = 0; $x < $this->width; $x++) {

for ($y = 0; $y < $this->height; $y++) {

$rgbColor = imagecolorat($this->image, $x, $y);

imagesetpixel($this->distortionImage, (int) ($x + sin($y / $this->height * 2 * M_PI - M_PI * 0.5) * 3), $y, $rgbColor);

}

}

$this->image = $this->distortionImage;

}

//@生成验证码图片

public function createImage()

{

$this->initImage(); //创建基本图片

$this->createText(); //输出验证码字符

if ($this->distortion) {

$this->distortionText();

} //扭曲文字

$this->createNoisePoint(); //产生干扰点

$this->createNoiseLine(); //产生干扰线

if ($this->showBorder) {

imagerectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $this->randFontColor);

} //添加边框

imagepng($this->image);

imagedestroy($this->image);

if ($this->distortion) {

imagedestroy($this->$distortionImage);

}

return $this->textContent;

}

}

?>

使用方法:<?php

//session_start();

header("Content-type:image/png");

include('captcha5_class.php');

$captcha5 = new Captcha();

//@设置验证码宽度

//$captcha5->setWidth(200);

//@设置验证码高度

//$captcha5->setHeight(50);

//@设置字符个数

$captcha5->setTextNumber(5);

//@设置字符颜色

//$captcha5->setFontColor('#ff9900');

//@设置字号大小

//$captcha5->setFontSize(25);

//@设置字体

$captcha5->setFontFamily('c:\windows\fonts\STXINGKA.TTF');

//@设置语言

$captcha5->setTextLang('cn');

//@设置背景颜色

//$captcha5->setBgColor('#000000');

//@设置干扰点数量

//$captcha5->setNoisePoint(600);

//@设置干扰线数量

//$captcha5->setNoiseLine(10);

//@设置是否扭曲

//$captcha5->setDistortion(true);

//@设置是否显示边框

$captcha5->setShowBorder(true);

//输出验证码

$code = $captcha5->createImage();

//$_SESSION['captchaCode']['content']=$code;

//$_SESSION['captchaCode']['time']=microtime();

?>

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值