using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.Drawing; using System.IO;
namespace 验证码的实现.ValidateCode { /// <summary> /// 验证码生成工具类 /// </summary> ///
public class ValidateCodeHelper { private static Random rand = new Random(); private static string code; /// <summary> /// 随机生成指定长度的验证码 /// </summary> /// <param name="length"></param> /// <returns></returns> public static string GetCode(int length) {
string codes = "AaBbCcDdEeFfJjHhIiJjKkMmNnPpQrRSsTtUuVvWwXxYyZz0123456789";
StringBuilder sb = new StringBuilder(); for (int i = 0; i <length; i++) { int index=rand.Next(codes.Length); if (sb.ToString().Contains(codes[index])) {
i--; continue; } sb.Append(codes[index]); } code = sb.ToString(); return code;
}
/// <summary> /// 获取随机颜色 /// </summary> /// <returns></returns> private static Color GetRandomColor() {
int red = rand.Next(10, 255); int green = rand.Next(10, 255); int blue = rand.Next(10, 255);
return Color.FromArgb(red, green, blue); }
/// <summary> /// 生成验证码 /// </summary> /// <returns></returns> public static byte[] ValidateCode(string code) {
Bitmap img = new Bitmap(100,30); Graphics g = Graphics.FromImage(img); g.FillRectangle(Brushes.White, 0, 0, img.Width, img.Height); g.DrawRectangle(new Pen(Color.Black), 1, 1, img.Width-2, img.Height-2); Brush bush = new SolidBrush(Color.SteelBlue); g.DrawString(code, new Font("黑体", 20, FontStyle.Italic), bush, 10, 2); Random r = new Random(); //画线条 for (int i = 0; i < 5; i++) { g.DrawLine(new Pen(GetRandomColor()), r.Next(img.Width), r.Next(img.Height), r.Next(img.Width), r.Next(img.Height)); } //画躁点 for (int i = 0; i < 100; i++) { img.SetPixel(r.Next(img.Width), r.Next(img.Height), GetRandomColor()); } MemoryStream ms = new MemoryStream(); img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] data = ms.GetBuffer(); g.Dispose(); ms.Close(); return data; }
/// <summary> /// 生成验证码 /// </summary> /// <param name="code">验证码</param> /// <param name="fontColor">验证码颜色</param> /// <returns></returns> public static byte[] ValidateCode(string code,Color fontColor) {
Bitmap img = new Bitmap(100,30); Graphics g = Graphics.FromImage(img);
g.FillRectangle(Brushes.White,0, 0, img.Width, img.Height);
Brush bush = new SolidBrush(fontColor); g.DrawString(code, new Font("黑体", 20, FontStyle.Italic), bush, 10, 2); Random r = new Random(); //画线条 for (int i = 0; i < 5; i++) { g.DrawLine(new Pen(GetRandomColor()), r.Next(img.Width), r.Next(img.Height), r.Next(img.Width), r.Next(img.Height)); } //画躁点 for (int i = 0; i < 100; i++) { img.SetPixel(r.Next(img.Width), r.Next(img.Height), GetRandomColor()); } MemoryStream ms = new MemoryStream(); img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] data = ms.GetBuffer(); g.Dispose(); ms.Close(); return data; } /// <summary> /// 生成验证码 /// </summary> /// <param name="code">验证码</param> /// <param name="fontColor">验证码颜色</param> /// <param name="backgroundColor">验证码背景颜色</param> /// <returns></returns> public static byte[] ValidateCode(string code,Color backgroundColor, Color fontColor) {
Bitmap img = new Bitmap(100, 30); Graphics g = Graphics.FromImage(img); Brush bush1 = new SolidBrush(backgroundColor); g.FillRectangle(bush1, 0, 0, img.Width, img.Height); Brush bush = new SolidBrush(fontColor); g.DrawString(code, new Font("黑体", 20, FontStyle.Italic), bush, 10, 2); Random r = new Random(); //画线条 for (int i = 0; i < 5; i++) { g.DrawLine(new Pen(GetRandomColor()), r.Next(img.Width), r.Next(img.Height), r.Next(img.Width), r.Next(img.Height)); } //画躁点 for (int i = 0; i < 100; i++) { img.SetPixel(r.Next(img.Width), r.Next(img.Height), GetRandomColor()); } MemoryStream ms = new MemoryStream(); img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] data = ms.GetBuffer(); g.Dispose(); ms.Close(); return data; }
/// <summary> /// 判断验证码是否正确 /// </summary> /// <param name="Code"></param> /// <returns></returns> public static bool IsValidate(string Code) {
if (string.IsNullOrEmpty(Code)||!code.ToLower().Equals(Code.ToLower())) {
return false; }
return true; } } }
在控制器中的调用
public ActionResult ValidateCode(){
//获取指定长度验证码
string code= ValidateCodeHelper.GetCode(5); TempData["code"] = code;//存储验证码用于验证
//将验证码绘制到图片上、保存到内存流中并返回字节数组 byte[] data= ValidateCodeHelper.ValidateCode(code);
return File(data,"image/jpeg"); }
在前端的调用
<script>
function change() {
var img = document.getElementsByTagName('img')[0];
img.src = img.src + "?";
} </script> <form method="post" action="/Home/Login"> <table> <tr> <td>验证码:</td> <td><img src="/Home/ValidateCode" style="cursor:pointer" onclick="this.src =this.src+'?'" /> <a href="javascript:void(0)" onclick="change()">换一张</a> </td> </tr> <tr> <td>输入验证码:</td> <td><input type="text" name="code"/></td> </tr> </table> <input type="submit" value="提交"/> </form>
|
请发表评论