ZendCaptcha验证码图片.docx

上传人:b****7 文档编号:10407766 上传时间:2023-02-11 格式:DOCX 页数:12 大小:33.74KB
下载 相关 举报
ZendCaptcha验证码图片.docx_第1页
第1页 / 共12页
ZendCaptcha验证码图片.docx_第2页
第2页 / 共12页
ZendCaptcha验证码图片.docx_第3页
第3页 / 共12页
ZendCaptcha验证码图片.docx_第4页
第4页 / 共12页
ZendCaptcha验证码图片.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

ZendCaptcha验证码图片.docx

《ZendCaptcha验证码图片.docx》由会员分享,可在线阅读,更多相关《ZendCaptcha验证码图片.docx(12页珍藏版)》请在冰豆网上搜索。

ZendCaptcha验证码图片.docx

ZendCaptcha验证码图片

Zend_Captcha验证码研究

2011-02-2314:

48:

21|分类:

zend框架|标签:

mt_randcaptchaimg2syphp|字号大中小订阅

复制PHP内容到剪贴板

PHP代码:

private$codeSession;//定义一个全局Zend_Session_Namespace

$this->codeSession=newZend_Session_Namespace('code');//在默认构造函数里实例化

$captcha=newZend_Captcha_Image(array('font'=>'/images/Faktos.ttf',//字体文件路径

'fontsize'=>24,

'imgdir'=>'images/captcha',//验证码图片存放位置

'session'=>$this->codeSession,

'width'=>200,

'height'=>50,

'wordlen'=>5));//字母数

$captcha->setGcFreq(3);//设置删除生成的旧的验证码图片的随机几率

$captcha->generate();//生成图片

$this->codeSession->code=$captcha->getWord();//获取当前生成的验证字符串

echo$this->codeSession->code;

Faktos.ttf这是字体文件.换成你的也可以.注意路径.

出来的结果如下

f1c6dff54ea216457a0cc58ff9a52f9b.png(8.25KB)

2008-9-514:

21

并且实现了验证码字符存放在了session中.

现在问题,怎么降噪,上面的黑色斑点太多了...

(1)编辑Zend/Captcha/Image.php

两个地方同时改动红色数字降低躁点,查找imagefilledellipse

//generatenoise

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

imagefilledellipse($img,mt_rand(0,$w),mt_rand(0,$h),2,2,$text_color);

}

或者

(2)

PHP代码:

classImgCodeextendsZend_Captcha_Image

{

protectedfunction_generateImage($id,$word)

{

if(!

extension_loaded("gd")){

require_once'Zend/Form/Exception.php';

thrownewZend_Form_Exception("ImageCAPTCHArequiresGDextension");

}

if(!

function_exists("imagepng")){

require_once'Zend/Form/Exception.php';

thrownewZend_Form_Exception("ImageCAPTCHArequiresPNGsupport");

}

if(!

function_exists("imageftbbox")){

require_once'Zend/Form/Exception.php';

thrownewZend_Form_Exception("ImageCAPTCHArequiresFTfontssupport");

}

$font=$this->getFont();

if(empty($font)){

require_once'Zend/Form/Exception.php';

thrownewZend_Form_Exception("ImageCAPTCHArequiresfont");

}

@header("Content-Type:

image/png");//这是我添加的

$w=$this->getWidth();

$h=$this->getHeight();

$fsize=$this->getFontSize();

$img_file=$this->getImgDir().$id.$this->getSuffix();

$img=imagecreatetruecolor($w,$h);

$text_color=imagecolorallocate($img,0,0,0);

$bg_color=imagecolorallocate($img,255,255,255);

imagefilledrectangle($img,0,0,$w-1,$h-1,$bg_color);

$textbox=imageftbbox($fsize,0,$font,$word);

$x=($w-($textbox[2]-$textbox[0]))/2;

$y=($h-($textbox[7]-$textbox[1]))/2;

imagefttext($img,$fsize,0,$x,$y,$text_color,$font,$word);

//generatenoise

//for($i=0;$i<100;$i++){

//imagefilledellipse($img,mt_rand(0,$w),mt_rand(0,$h),2,2,$text_color);

//}

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

imageline($img,mt_rand(0,$w),mt_rand(0,$h),mt_rand(0,$w),mt_rand(0,$h),$text_color);

}

//transformedimage

$img2=imagecreatetruecolor($w,$h);

$bg_color=imagecolorallocate($img2,255,255,255);

imagefilledrectangle($img2,0,0,$w-1,$h-1,$bg_color);

//applywavetransforms

$freq1=$this->_randomFreq();

$freq2=$this->_randomFreq();

$freq3=$this->_randomFreq();

$freq4=$this->_randomFreq();

$ph1=$this->_randomPhase();

$ph2=$this->_randomPhase();

$ph3=$this->_randomPhase();

$ph4=$this->_randomPhase();

$szx=$this->_randomSize();

$szy=$this->_randomSize();

for($x=0;$x<$w;$x++){

for($y=0;$y<$h;$y++){

$sx=$x+(sin($x*$freq1+$ph1)+sin($y*$freq3+$ph3))*$szx;

$sy=$y+(sin($x*$freq2+$ph2)+sin($y*$freq4+$ph4))*$szy;

if($sx<0||$sy<0||$sx>=$w-1||$sy>=$h-1){

continue;

}else{

$color=(imagecolorat($img,$sx,$sy)>>16)&0xFF;

$color_x=(imagecolorat($img,$sx+1,$sy)>>16)&0xFF;

$color_y=(imagecolorat($img,$sx,$sy+1)>>16)&0xFF;

$color_xy=(imagecolorat($img,$sx+1,$sy+1)>>16)&0xFF;

}

if($color==255&&$color_x==255&&$color_y==255&&$color_xy==255){

//ignorebackground

continue;

}elseif($color==0&&$color_x==0&&$color_y==0&&$color_xy==0){

//transferinsideoftheimageas-is

$newcolor=0;

}else{

//doantialiasingforborderitems

$frac_x=$sx-floor($sx);

$frac_y=$sy-floor($sy);

$frac_x1=1-$frac_x;

$frac_y1=1-$frac_y;

$newcolor=$color*$frac_x1*$frac_y1

+$color_x*$frac_x*$frac_y1

+$color_y*$frac_x1*$frac_y

+$color_xy*$frac_x*$frac_y;

}

imagesetpixel($img2,$x,$y,imagecolorallocate($img2,$newcolor,$newcolor,$newcolor));

}

}

//generatenoise

//for($i=0;$i<100;$i++){

//imagefilledellipse($img2,mt_rand(0,$w),mt_rand(0,$h),2,2,$text_color);

//}

//for($i=0;$i<5;$i++){

//imageline($img2,mt_rand(0,$w),mt_rand(0,$h),mt_rand(0,$w),mt_rand(0,$h),$text_color);

//}

imagepng($img2);//这里我去掉了$img_file这个参数

imagedestroy($img);

imagedestroy($img2);

}

}

只是继承了Zend_Captcha_Image并重写了里面的方法,只是把他的方法复制过来.然后注释了几行.加了header

把ImgCode这个类放在modules目录里就可以了

Zend居然每刷新一次就生成一张图片并且存放到$imgdir下面

在这里设定一个图片数量超过限制就自动删除。

如上代码所示$captcha->setGcFreq(3)

另外需要修改protectedfunction_gc()函数为:

protectedfunction_gc()

{

//$expire=time()-$this->getExpiration();

$expire=time();

echo$this->getExpiration();

foreach(newDirectoryIterator($this->getImgDir())as$file){

if(!

$file->isDot()&&!

$file->isDir()){

if($file->getMTime()<$expire){

unlink($file->getPathname());

}

}

}

}

PHP代码:

$captcha=newImgCode(array('font'=>'/images/Faktos.ttf',//字体路径

'fontsize'=>字体大小,

'session'=>$this->codeSession,//存放的session对象

'width'=>宽,

'height'=>高,

'wordlen'=>字符数));

$id=$captcha->generate();

Zend_Captcha_Image配置和使用

2009-11-2416:

40

Zend的验证码功能其实做得还是蛮不错的,各方面设置都比较方便,不过在使用之前要按自己的需求进行设置,方法有几种:

1.比较简单的就是New一个,在构造里传入array('font'=>...,'imgDir'=>........);

2.先New一个,然后调用setOptions()进行设置

3.做一个自己的类,然后继承Zend_Captcha_Image,然后直接通过$this._font='.....'修改默认属性

4.建一个config配置文件,然后传入newZend_Config_Ini($config)或newZend_Config_Xml($config)进行设置

Zend_Captcha_Image基本的有几种属性可以设置:

imgDir:

图片存放路径默认/images/captcha/

imgUrl:

图片url地址默认/images/captcha/

suffix:

图片后缀默认png

imgAlt:

图片说明默认空

width:

图片宽默认200

height:

图片高默认50

fsize:

字体大小默认24

font:

字体样式路径null

Wordlen:

字数默认8

startImage:

背景图片null

gcFreq:

删除缓存图片随机频率默认10

expiration:

过期时限默认600秒

dotNoiseLevel:

干扰杂点数量默认100

lineNoiseLevel:

干扰线条数量默认5

其它项还可以设置

sessionClass:

session类,默认使用Zend_Session_Namespace

session:

可以使用自定义的session方案

message/messages:

提示信息,这个继承自Zend_Validate_Abstract

messageLength:

提示信息长度,这个继承自Zend_Validate_Abstract

等等

通过此句实现用config开进行配置:

$captcha=newZend_Captcha_Image(newZend_Config_Ini(APPLICATION_PATH.'/configs/captcha.ini'));

其中captcha.ini我的设置是这样的:

font=APPLICATION_PATH"/../html/font/framd.ttf";

imgDir=APPLICATION_PATH"/../html/images/code";

imgUrl="/images/code";

imgAlt="验证码";

width=120;

height=40;

fsize=20;

wordlen=4;

gcFreq=5;

expiration=60;

dotNoiseLevel=30;

lineNoiseLevel=3;

通过以下可以自定义一个this全局session:

$this->codeSession=newZend_Session_Namespace('code');

$captcha=newZend_Captcha_Image(newZend_Config_Ini(APPLICATION_PATH.'/configs/captcha.ini'));

$captcha->setSession($this->codeSession);

$captcha->generate();

$this->codeSession->code=$captcha->getWord();

echo$this->codeSession->code;

ZendFramework编程:

Zend_Captcha实例

标签:

效果图zendcaptchasessiongetid分类:

zend2010-12-0315:

48

1.效果图

2.Controller文件中的相关代码

--------------------------------------------------------------------------------------------------------------

publicfunctionmakecaptchaAction()

{

//$this->_helper->layout->disableLayout();

//$this->_helper->viewRenderer->setNoRender();

$this->captcha_session=newZend_Session_Namespace('captcha');//在默认构造函数里实例化

$captcha=newZend_Captcha_Image(array(

'font'=>'./fonts/arial.ttf',//字体文件路径

'session'=>$this->captcha_session,//验证码session值

'fontsize'=>15,//字号

'imgdir'=>'./temp/captcha/',//验证码图片存放位置

'width'=>120,//图片宽

'height'=>40,//图片高

'gcFreq'=>3,//删除生成的旧的验证码图片的随机几率

'dotNoiseLevel'=>10,//躁点数

'lineNoiseLevel'=>3,//线条

'wordlen'=>5)//字母数

);

$captcha->generate();//生成图片

//Header方式

$captcha_imgpath=$captcha->getImgDir().$captcha->getId().'.png';

header("Content-type:

image/png");

imagepng(imagecreatefrompng($captcha_imgpath));

//界面方式

$this->view->img_dir=$captcha->getImgDir();

$this->view->captcha_id=$captcha->getId();//获取文件名,md5编码

//$this->captcha_session->code=$captcha->getWord();//获取当前生成的验证字符串

//echo$this->captcha_session->code;

}

--------------------------------------------------------------------------------------------------------------

2.VIEW页面代码

--------------------------------------------------------------------------------------------------------------

img_dir,$this->captcha_id?

>.png"border="0"/>

--------------------------------------------------------------------------------------------------------------

值得注意的是:

系统默认的验证图片躁点较多,需要看情况修改躁点的个数。

遗留问题:

自动刷新验证码一次,则生成一张图片,并且存放到$imgdir目录下,这样随着时间的推移,则图片会越来越多。

尽管网上有资料说通过设置函数(setGcFreq())的参数,可以解决该问题,但目前我还未能解决该问题。

函数调用如下:

$captcha->setGcFreq(3);//设定一个图片数量,超过限制就自动删除

其实设置expiration就可以了会自动清除过期验证码图片的

 

Captcha适配器

ZendFramework缺省地带有下列适配器。

Zend_Captcha_Word

Zend_Captcha_Word是个摘要适配器,它是Dumb、Figlet和Image适配器的基础。

,它提供了增变器用来指定字符长度、会话TTL、会话命名空间对象,如果你不想使用Zend_Session_Namespace,它提供了会话命名空间来用于持久。

另外,它封装了所有校验逻辑。

缺省地,字符长度为8,会话超时为5分钟,Zend_Session_Namespace用于持久(使用命名空间"Zend_Form_Captcha_")。

除了Zend_Captcha_Adapter接口要求的标准方法外,Zend_Captcha_Word还有下列方法:

∙setWordLen($length)和getWordLen()指定生成的“字符”的长度和获取当前值。

∙setTimeout($ttl)和getTimeout()指定会话令牌的time-to-live和获取当前值。

$ttl以秒计。

∙setSessionClass($class)和getSessionClass()指定替代的Zend_Session_Namespace实现来持久captcha令牌和获取当前值。

∙getId()获取当前令牌标识符。

∙getWord()获取用于captcha的生成字符,如果以前没有生成,它将生成一个。

∙setSession(Zend_Session_Namespace$session)指定一个会话对象用来持久captcha令牌;getSession()获取当前会话对象。

所有字符captchas传递一个选项数组给构造器,或者把它们传递给setOptions()(或传递一个Zend_Config对象给setConfig())。

缺省地,可能使用所有

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1