把验证码和生成时间负值给$_SESSION[vCode]生成图像给浏览器
php 图片 中文验证码
<img src="verify_image.php" alt="点此刷新验证码" name="verify_code" width="65" height="20" border="0" id="verify_code" onclick="document.getElementById('verify_code').src='verify_image.php?'+Math.random();" style="cursor:pointer;" />
<?php
session_start();
$vi = new vCodeImage;
$vi->SetImage(1,4,65,20,80,1);
class vCodeImage{
var $mode; //1:数字模式,2:字母模式,3:数字字母模式,其他:数字字母优化模式
var $v_num; //验证码个数
var $img_w; //验证码图像宽度
var $img_h; //验证码图像高度
var $int_pixel_num; //干扰像素个数
var $int_line_num; //干扰线条数
var $font_dir; //字体文件相对路径
var $border; //图像边框
var $borderColor; //图像边框颜色
function SetImage($made,$v_num,$img_w,$img_h,$int_pixel_num,$int_line_num,$font_dir='../font',$border=true,$borderColor='255,200,85'){
if(!isset($_SESSION['vCode'])){
session_register('vCode');
}
$_SESSION['vCode']="";
$this->mode = $made;
$this->v_num = $v_num;
$this->img_w = $img_w;
$this->img_h = $img_h;
$this->int_pixel_num = $int_pixel_num;
$this->int_line_num = $int_line_num;
$this->font_dir = $font_dir;
$this->border = $border;
$this->borderColor = $borderColor;
$this->GenerateImage();
}
function GetChar($mode){
if($mode == "1"){2881064151
$ychar = "0,1,2,3,4,5,6,7,8,9";
}
else if($mode == "2"){
$ychar = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
}
else if($mode == "3"){
$ychar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
}
else
$ychar = "3,4,5,6,7,8,9,A,B,C,D,H,K,P,R,S,T,W,X,Y";
return $ychar;
}
function RandColor($rs,$re,$gs,$ge,$bs,$be){
$r = mt_rand($rs,$re);
$g = mt_rand($gs,$ge);
$b = mt_rand($bs,$be);
return array($r,$g,$b);
}
function GenerateImage(){
$im = imagecreate($this->img_w,$this->img_h);
$black = imagecolorallocate($im, 0,0,0);
$white = imagecolorallocate($im, 255,255,255);
$bgcolor = imagecolorallocate($im, 250,250,250);
imagefill($im,0,0,$bgcolor);
$fonts = ScanDir($this->font_dir);
$fmax = count($fonts) - 2;
$ychar = $this->GetChar($this->mode);
$list = explode(",",$ychar);
$x = mt_rand(2,$this->img_w/($this->v_num+2));
$cmax = count($list) - 1;
$v_code = '';
for($i=0;$i<$this->v_num;$i++) //验证码
{
$randnum = mt_rand(0,$cmax);
$this_char = $list[$randnum];
$v_code .= $this_char;
$size = mt_rand(intval($this->img_w/5),intval($this->img_w/4));
$angle = mt_rand(-20,20);
$y = mt_rand(($size+2),($this->img_h-2));
if($this->border)
$y = mt_rand(($size+3),($this->img_h-3));
$rand_color = $this->RandColor(0,200,0,100,0,250);
$randcolor = imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);
$fontrand = mt_rand(2, $fmax);
$font = "$this->font_dir/".$fonts[$fontrand];
imagettftext($im, $size, $angle, $x, $y, $randcolor, $font, $this_char);
$x = $x + intval($this->img_w/($this->v_num+1));
}
for($i=0;$i<$this->int_pixel_num;$i++){//干扰像素
$rand_color = $this->RandColor(50,250,0,250,50,250);
$rand_color_pixel = imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);
imagesetpixel($im, mt_rand()%$this->img_w, mt_rand()%$this->img_h, $rand_color_pixel);
}
for($i=0;$i<$this->int_line_num;$i++){ //干扰线
$rand_color = $this->RandColor(0,250,0,250,0,250);
$rand_color_line = imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);
imageline($im, mt_rand(0,intval($this->img_w/3)), mt_rand(0,$this->img_h), mt_rand(intval($this->img_w - ($this->img_w/3)),$this->img_w), mt_rand(0,$this->img_h), $rand_color_line);
}
if($this->border) //画出边框
{
if(preg_match("/^\d{1,3},\d{1,3},\d{1,3}$/",$this->borderColor)){
$borderColor = explode(',',$this->borderColor);
}
$border_color_line = imagecolorallocate($im,$borderColor[0],$borderColor[1],$borderColor[2]);
imageline($im, 0, 0, $this->img_w, 0, $border_color_line); //上横
imageline($im, 0, 0, 0, $this->img_h, $border_color_line); //左竖
imageline($im, 0, $this->img_h-1, $this->img_w, $this->img_h-1, $border_color_line); //下横
imageline($im, $this->img_w-1, 0, $this->img_w-1, $this->img_h, $border_color_line); //右竖
}
imageantialias($im,true); //抗锯齿
$time = time();
$_SESSION['vCode'] = $v_code."|".$time; //把验证码和生成时间负值给$_SESSION[vCode]
//生成图像给浏览器
if (function_exists("imagegif")) {
header ("Content-type: image/gif");
imagegif($im);
}
elseif (function_exists("imagepng")) {
header ("Content-type: image/png");
imagepng($im);
}
elseif (function_exists("imagejpeg")) {
header ("Content-type: image/jpeg");
imagejpeg($im, "", 80);
}
elseif (function_exists("imagewbmp")) {
header ("Content-type: image/vnd.wap.wbmp");
imagewbmp($im);
}
else
die("No Image Support On This Server !");
imagedestroy($im);
}
}
?>
把验证码和生成时间负值给$_SESSION[vCode]生成图像给浏览器的更多相关文章
- DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)
跟大家的交流是我的动力. :) DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★ ...
- captcha.js一个生成验证码的插件,使用js和canvas生成
一.captcha`captcha.js`是一个生成验证码的插件,使用js和canvas生成的,确保后端服务被暴力攻击,简单判断人机以及系统的安全性,体积小,功能多,支持配置. 验证码插件内容,包含1 ...
- MySQL学习笔记:生成时间维度表
# ---- 对应时间戳怎么生成的? ---- /*TIME_CD TIME_CD1000000 000005000001 000005000002 000005000003 000005000004 ...
- DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension)
DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★★★★★(5星) 这个时间系列想 ...
- oracle随机生成时间
Julian Date定义 Julian Date:有效的日期范围是从公元前4713年1月1日到公元9999年12月31日.儒略日(julian date)是自公元前4713年1月1日中午12时起经过 ...
- 使用EF Code First生成模型,如何让时间字段由数据库自动生成
场景:保存记录时需要时间字段,该时间如果由前台通过DateTime.Now产生,存在风险,比如修改客户端的系统时间,就会伪造该记录的生成时间.因此,需要在保存记录时,由后台自动赋予具体的时间. 实现方 ...
- 卷积生成对抗网络(DCGAN)---生成手写数字
深度卷积生成对抗网络(DCGAN) ---- 生成 MNIST 手写图片 1.基本原理 生成对抗网络(GAN)由2个重要的部分构成: 生成器(Generator):通过机器生成数据(大部分情况下是图像 ...
- C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll调用、动态调用
1.直接调用 已知webservice路径,则可以直接 添加服务引用--高级--添加web引用 直接输入webservice URL.这个比较常见也很简单 即有完整的webservice文件目录如下图 ...
- wsdl自动生成Java代码,根据wsdl生成Java代码
wsdl自动生成Java代码,根据wsdl生成Java代码 >>>>>>>>>>>>>>>>>&g ...
随机推荐
- windows下自动关机
定时:at 00:00 shutdown -s //在00:00时关机 倒计时:shutdown -s -t 3600 //3600s后关机 取消:shutdown -a
- SpringRMI解析1-使用示例
Java远程方法调用,即JavaRMI(JavaRemote Method Invocation),是Java编程语言里一种用于实现远程过程调用的应用程序编程接口.它使客户机上的运行的程序可以调用远程 ...
- jQuery方法注意事项
1.关于选择器中含有特殊符号 选择器中含有".","#","(","]"等特殊字符,根据W3C的规定,属性值中是不能含有 ...
- WPF XAML之bing使用StringFormat
WPF XAML之bing使用StringFormat // 转化为百分比 Text="{Binding Progress, StringFormat=\{0:P\}}" < ...
- JavaOne_2016演讲视频:
http://list.youku.com/albumlist/show?id=28553407&qq-pf-to=pcqq.group
- (转)POJ题目分类
初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. ...
- Python基础10- 函数之内部函数与强制转换
#coding=utf-8 import mathimport osimport socket Python函数包括以下三类:内部函数.第三方函数和自定义函数内部函数包括:字符函数库.数学函数库.系统 ...
- JS验证金额
<script type="text/javascript"> function ismoney(obj) { check(obj) ...
- OpenResty 通过二级域名做跳转
if ( $host ~* (\b(?!www\b)\w+)\.\w+\.\w+ ) { #获取nba.test.com域名中的nba set $subdomain $1; } location / ...
- CentOS6.4 访问域局网中Windows的共享
mount -t cifs -o username=" //10.10.3.246/f /usr/local/openresty/nginx/html/down 说明: mount -t c ...