ZendCaptcha验证码图片.docx
- 文档编号:10407766
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:12
- 大小:33.74KB
ZendCaptcha验证码图片.docx
《ZendCaptcha验证码图片.docx》由会员分享,可在线阅读,更多相关《ZendCaptcha验证码图片.docx(12页珍藏版)》请在冰豆网上搜索。
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页面代码
--------------------------------------------------------------------------------------------------------------
>.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())。
缺省地,可能使用所有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ZendCaptcha 验证 图片