基于GD库的php验证码类(支持中英文字体、背景、干扰点线、扭曲.......)
发布时间:2020-05-25 07:05:45 所属栏目:PHP 来源:互联网
导读:基于GD库的php验证码类(支持中英文字体、背景、干扰点线、扭曲.......)
|
下面是脚本之家 jb51.cc 通过网络收集整理的代码片段。 脚本之家小编现在分享给大家,也给大家做个参考。 <?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:windowsfontsSIMYOU.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),255));
} else {
$this->randBgColor = imagecolorallocate($this->image,$this->bgColor[0],$this->bgColor[1],$this->bgColor[2]);
}
imagefill($this->image,$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),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,255));
imagesetpixel($this->image,$this->width),$this->height),$pointColor);
}
}
//@产生干扰线
public function createNoiseLine()
{
for ($i = 0; $i < $this->noiseLine; $i++) {
$lineColor = imagecolorallocate($this->image,20);
imageline($this->image,$this->width,$lineColor);
}
}
//@扭曲文字
public function distortionText()
{
$this->distortionImage = imagecreatetruecolor($this->width,$this->height);
imagefill($this->distortionImage,$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,$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:windowsfontsSTXINGKA.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();
?>
以上是脚本之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。 如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
