using System.Web.Mvc;
using System.Drawing;
using System;
using System.Drawing.Imaging;
using Models;
using System.IO; namespace MvcApp.Controllers
{
/// <summary>
/// 用户账户信息
/// </summary>
[HandleError]
public class AccountController : BaseController
{
/// <summary>
/// 获取验证码图片
/// </summary>
/// <returns></returns>
public ActionResult ValidateCode()
{
//生成验证码字符
string vnum = GetByRndNum();
int width = vnum.Length * ; Graphics g = null; //画布
Bitmap bitmap = new Bitmap(width, ); //图片
g = Graphics.FromImage(bitmap);
g.Clear(Color.White); //设定背景色 Font font = new Font("微软雅黑", , FontStyle.Bold);
SolidBrush brush = new SolidBrush(ColorTranslator.FromHtml("#411464"));
g.DrawString(vnum, font, brush, , ); //画数字 // 随机产生干扰线,使图象中的认证码不易被其它程序探测到
Random random = new Random();
Pen pen = new Pen(ColorTranslator.FromHtml("lightblue"), );
for (int i = ; i < ; i++)
{
int x = random.Next(width);
int y = random.Next();
int xstep = random.Next();
int ystep = random.Next();
g.DrawLine(pen, x + , y, x + xstep, y + ystep);
} //画矩形边框
pen.Width = ;
g.DrawRectangle(pen, , , bitmap.Width - , bitmap.Height - ); MemoryStream ms = new MemoryStream();
bitmap.Save(ms, ImageFormat.Jpeg); //也可以直接保存到响应流中
//Response.ClearContent(); //需要输出图象信息 要修改HTTP头
//Response.ContentType = "image/jpeg";
//bitmap.Save(Response.OutputStream, ImageFormat.Jpeg); g.Dispose();
bitmap.Dispose();
font.Dispose();
brush.Dispose();
pen.Dispose(); return File(ms.ToArray(), "image/jpeg");
} /// <summary>
/// 随机生成验证码(数字)
/// </summary>
/// <param name="VcodeNum"></param>
/// <returns></returns>
public string GetByRndNum(int VcodeNum)
{
string VNum = "";
string VcArray = ""; Random rand = new Random(); for (int i = ; i < VcodeNum; i++)
{
VNum += VcArray[rand.Next(, )];
} Session["__VCode"] = VNum; return VNum;
}
}
}

附:验证码操作简易封装

using System;
using System.Drawing;
using System.Web; namespace Utility
{
public class VerifyCode
{
#region 验证码长度(默认6个验证码的长度)
int length = ;
public int Length
{
get { return length; }
set { length = value; }
}
#endregion #region 验证码字体大小(为了显示扭曲效果,默认40像素,可以自行修改)
int fontSize = ;
public int FontSize
{
get { return fontSize; }
set { fontSize = value; }
}
#endregion #region 边框补(默认1像素)
int padding = ;
public int Padding
{
get { return padding; }
set { padding = value; }
}
#endregion #region 是否输出燥点(默认不输出)
bool chaos = true;
public bool Chaos
{
get { return chaos; }
set { chaos = value; }
}
#endregion #region 输出燥点的颜色(默认灰色)
Color chaosColor = Color.LightGray;
public Color ChaosColor
{
get { return chaosColor; }
set { chaosColor = value; }
}
#endregion #region 自定义背景色(默认白色)
Color backgroundColor = Color.White;
public Color BackgroundColor
{
get { return backgroundColor; }
set { backgroundColor = value; }
}
#endregion #region 自定义随机颜色数组
Color[] colors = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
public Color[] Colors
{
get { return colors; }
set { colors = value; }
}
#endregion #region 自定义字体数组
string[] fonts = { "Arial", "Georgia" };
public string[] Fonts
{
get { return fonts; }
set { fonts = value; }
}
#endregion #region 自定义随机码字符串序列(使用逗号分隔)
string codeSerial = "1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,j,k,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";
//string codeSerial = "0,1,2,3,4,5,6,7,8,9";
public string CodeSerial
{
get { return codeSerial; }
set { codeSerial = value; }
}
#endregion #region 产生波形滤镜效果 private const double PI = 3.1415926535897932384626433832795;
private const double PI2 = 6.283185307179586476925286766559; /// <summary>
/// 正弦曲线Wave扭曲图片(Edit By 51aspx.com)
/// </summary>
/// <param name="srcBmp">图片路径</param>
/// <param name="bXDir">如果扭曲则选择为True</param>
/// <param name="nMultValue">波形的幅度倍数,越大扭曲的程度越高,一般为3</param>
/// <param name="dPhase">波形的起始相位,取值区间[0-2*PI)</param>
/// <returns></returns>
public System.Drawing.Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
{
System.Drawing.Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height); // 将位图背景填充为白色
System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(destBmp);
graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), , , destBmp.Width, destBmp.Height);
graph.Dispose(); double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width; for (int i = ; i < destBmp.Width; i++)
{
for (int j = ; j < destBmp.Height; j++)
{
double dx = ;
dx = bXDir ? (PI2 * (double)j) / dBaseAxisLen : (PI2 * (double)i) / dBaseAxisLen;
dx += dPhase;
double dy = Math.Sin(dx); // 取得当前点的颜色
int nOldX = , nOldY = ;
nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
nOldY = bXDir ? j : j + (int)(dy * dMultValue); System.Drawing.Color color = srcBmp.GetPixel(i, j);
if (nOldX >= && nOldX < destBmp.Width
&& nOldY >= && nOldY < destBmp.Height)
{
destBmp.SetPixel(nOldX, nOldY, color);
}
}
} return destBmp;
} #endregion #region 生成校验码图片
public Bitmap CreateImageCode(string code)
{
int fSize = FontSize;
int fWidth = fSize + Padding; int imageWidth = (int)(code.Length * fWidth) + + Padding * ;
int imageHeight = fSize * + Padding; System.Drawing.Bitmap image = new System.Drawing.Bitmap(imageWidth, imageHeight); Graphics g = Graphics.FromImage(image); g.Clear(BackgroundColor); Random rand = new Random(); //给背景添加随机生成的燥点以及噪音线
if (this.Chaos)
{ Pen pen = new Pen(ChaosColor, );
int c = Length * ; for (int i = ; i < c; i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height); g.DrawRectangle(pen, x, y, , );
}
int x1;
int y1;
int x2;
int y2;
for (int i = ; i < ; ++i)
{
x1 = rand.Next(image.Width);
y1 = rand.Next(image.Height);
x2 = rand.Next(image.Width);
y2 = rand.Next(image.Height);
g.DrawLine(new Pen(Color.FromArgb(rand.Next(), rand.Next(), rand.Next())), x1, y1, x2, y2);
}
} int left = , top = , top1 = , top2 = ; int n1 = (imageHeight - FontSize - Padding * );
int n2 = n1 / ;
top1 = n2;
top2 = n2 * ; Font f;
Brush b; int cindex, findex; //随机字体和颜色的验证码字符
for (int i = ; i < code.Length; i++)
{
cindex = rand.Next(Colors.Length - );
findex = rand.Next(Fonts.Length - ); f = new System.Drawing.Font(Fonts[findex], fSize, System.Drawing.FontStyle.Bold);
b = new System.Drawing.SolidBrush(Colors[cindex]); if (i % == )
{
top = top2;
}
else
{
top = top1;
} left = i * fWidth; g.DrawString(code.Substring(i, ), f, b, left, top);
} //产生波形(Add By 51aspx.com)
//image = TwistImage(image, true, 10, rand.NextDouble() * 4 + 2); //画一个边框 边框颜色为Color.Gainsboro
g = Graphics.FromImage(image);
g.DrawRectangle(new Pen(Color.Gainsboro, ), , , image.Width - , image.Height - );
g.Dispose(); return image;
}
#endregion #region 将创建好的图片输出到页面
public void CreateImageOnPage(string code, HttpContext context)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
Bitmap image = this.CreateImageCode(code); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); context.Response.ClearContent();
context.Response.Expires = -;
context.Response.CacheControl = "no-cache";
context.Response.ContentType = "image/Jpeg";
context.Response.BinaryWrite(ms.GetBuffer()); ms.Close();
ms = null;
image.Dispose();
image = null;
}
#endregion #region 生成随机字符码
public string CreateVerifyCode(int codeLen)
{
if (codeLen == )
{
codeLen = Length;
} string[] arr = CodeSerial.Split(','); string code = ""; int randValue = -; Random rand = new Random(unchecked((int)DateTime.Now.Ticks)); for (int i = ; i < codeLen; i++)
{
randValue = rand.Next(, arr.Length - ); code += arr[randValue];
} return code;
}
public string CreateVerifyCode()
{
return CreateVerifyCode();
}
#endregion
}
}

ASP.NET MVC 生成验证码的更多相关文章

  1. (一)【转】asp.net mvc生成验证码

    网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录.灌水等危害网站的操作.验证码被广泛应用在注册.登录.留言等提交信息到服务器端处理的页面中.   ...

  2. Asp.net mvc生成验证码

    1.生成验证码类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  3. ASP.Net MVC 生成安全验证码

    ---------html <td>验证码:</td>            <td>                <img src="/Logi ...

  4. ASP.NET MVC生成安全验证码

    html部分: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  5. ASP.NET MVC5 生成验证码

    1 ValidateCode.cs using System; using System.Drawing; using System.Drawing.Drawing2D; using System.D ...

  6. C#工具:ASP.NET MVC生成图片验证码

    1.复制下列代码,拷贝到控制器中. #region 生成验证码图片 // [OutputCache(Location = OutputCacheLocation.None, Duration = 0, ...

  7. ASP.NET MVC 生成EML文件

    需求: 点发送邮件按钮的时候, 自动在客户端电脑打开默认邮件的窗口,并且把内容和附件都附加上去. 解决方案: 尝试使用过Microsoft.Office.Interop.Outlook 和 MPAI. ...

  8. asp.net mvc 生成条形码

    using System; using System.Collections; using System.Collections.Generic; using System.Drawing; usin ...

  9. Asp.net MVC 生成zip并下载

    前面有生成Excel或Word的示例,所以就不再重新写了. 这里只提供将指定文件以ZIP的方式下载. 创建一个 Zip工具类 public class ZIPCompressUtil { public ...

随机推荐

  1. Codeforces Round #489 (Div. 2) B、C

    B. Nastya Studies Informatics time limit per test 1 second memory limit per test 256 megabytes input ...

  2. POJ 3255_Roadblocks

    题意: 无向图,求单源次短路,每条边可以走多次. 分析: 对于每个点记录最短路和次短路,次短路可以是由最短路+边或者是次短路+边更新而来.在更新每个点的最短路时,相应更新次短路,如果最短路更新了,就令 ...

  3. 关于SQL SERVER导出数据的问题!

    前面一段时间,为这个导出数据真是煞费苦心,网上找了好多资料都没有找到. 从SQL SERVER 2008开始,我们就可以很方便的导出数据脚本,而无需再借助存储过程,但是SQL Server 2012和 ...

  4. POJ 1384 POJ 1384 Piggy-Bank(全然背包)

    链接:http://poj.org/problem?id=1384 Piggy-Bank Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...

  5. Windows Update 的工具

    Windows Update MiniTool 是一款管理 Windows Update 的工具,可以取得微軟 Windows 修補程式更新包,Windows Update 是我們用來升級系統的元件, ...

  6. android 加密手机完毕后待机两分钟出现有频率的杂音

    这个音效是code里面主动加的,是为了提醒end user输入PIN的一个提示音,也标志着加密手机动作的完毕. 详细位置是在alps\packages\apps\Settings\src\com\an ...

  7. onenstack 简介

    一.云计算的前世今生 所有的新事物都不是突然冒出来的,都有前世和今生.云计算也是IT技术不断发展的产物. 要理解云计算,需要对IT系统架构的发展过程有所认识. 请看下 IT系统架构的发展到目前为止大致 ...

  8. C Language Study - gets , getchar &amp; scanf

    慢慢的发现C语言功底是如此的薄弱,被这几个字符输入函数搞糊涂了又~~ 来,再来忧伤一次吧~ 那么.我们从scanf開始: 假如说你要将一串字符输入到一字符数组里,例如以下面程序, char a[2]; ...

  9. 【bzoj2282】[Sdoi2011]消防

    两次bfs可得直径,答案一定不会小于所有点到直径的距离最大值,只要把直径上的边权设为0,任选直径上一点bfs可得将最大值作为二分下界,二分直径左右端点的舍弃部分 #include<algorit ...

  10. beego1---beego,bee环境配置

    1.配置环境变量GOPATH(代码路径,先在里面建立src,pkg,bin3个目录),GOROOT:go安装的目录,go安装目录下的bin目录放到Path环境变量. 安装完bee工具之后,bee 可执 ...