程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 懂得C#生成驗證碼的進程

懂得C#生成驗證碼的進程

編輯:C#入門知識

懂得C#生成驗證碼的進程。本站提示廣大學習愛好者:(懂得C#生成驗證碼的進程)文章只能為提供參考,不一定能成為您想要的結果。以下是懂得C#生成驗證碼的進程正文


本文實例為年夜家引見了生成驗證碼的具體進程,供年夜家參考,詳細內容以下

生成驗證碼的類:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;

namespace Controllers.Core.Util
{
  /// <summary>
  /// 驗證碼
  /// </summary>
  public class VerifyCodeHelper : AdminBaseController
  {
    #region 變量
    /// <summary>
    /// 色彩表
    /// </summary>
    private static Color[] colors = new Color[]{
      Color.FromArgb(220,20,60),
      Color.FromArgb(128,0,128),
      Color.FromArgb(65,105,225),
      Color.FromArgb(70,130,180),
      Color.FromArgb(46,139,87),
      Color.FromArgb(184,134,11),
      Color.FromArgb(255,140,0),
      Color.FromArgb(139,69,19),
      Color.FromArgb(0,191,255),
      Color.FromArgb(95,158,160),
      Color.FromArgb(255,20,147),
      Color.FromArgb(255,165,0)};

    /// <summary>
    /// 字體表
    /// </summary>
    private static string[] fonts = new string[] { 
      "Arial",
      "Verdana", 
      "Georgia", 
      "黑體" };

    /// <summary>
    /// 字體年夜小
    /// </summary>
    private static int fontSize = 22;
    #endregion

    #region 生成驗證碼圖片
    /// <summary>
    /// 生成驗證碼圖片
    /// </summary>
    public static Bitmap CreateVerifyCodeBmp(out string code)
    {
      int width = 120;
      int height = 40;
      Bitmap bmp = new Bitmap(width, height);
      Graphics g = Graphics.FromImage(bmp);
      Random rnd = new Random();

      //配景色
      g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, width, height));

      //文字
      StringBuilder sbCode = new StringBuilder();
      for (int i = 0; i < 4; i++)
      {
        string str = GetChar(rnd);
        Font font = GetFont(rnd);
        Color color = GetColor(rnd);
        g.DrawString(str, font, new SolidBrush(color), new PointF((float)(i * width / 4.0), 0));
        sbCode.Append(str);
      }
      code = sbCode.ToString();

      //樂音線
      for (int i = 0; i < 10; i++)
      {
        int x1 = rnd.Next(bmp.Width);
        int x2 = rnd.Next(bmp.Width);
        int y1 = rnd.Next(bmp.Height);
        int y2 = rnd.Next(bmp.Height);

        Pen p = new Pen(GetColor(rnd), 1);
        g.DrawLine(p, x1, y1, x2, y2);
      }

      //歪曲
      bmp = TwistImage(bmp, true, 3, rnd.NextDouble() * Math.PI * 2);
      g = Graphics.FromImage(bmp);

      //噪點
      for (int i = 0; i < 100; i++)
      {
        int x1 = rnd.Next(bmp.Width);
        int y1 = rnd.Next(bmp.Height);

        Pen p = new Pen(GetColor(rnd), 1);
        g.DrawRectangle(p, x1, y1, 1, 1);
      }

      //邊框
      g.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(153, 153, 153))), new Rectangle(0, 0, width - 1, height - 1));

      return bmp;
    }
    #endregion

    #region 獲得隨機字符
    /// <summary>
    /// 獲得隨機字符
    /// </summary>
    private static string GetChar(Random rnd)
    {
      int n = rnd.Next(0, 61);
      if (n <= 9)
      {
        return ((char)(48 + n)).ToString();
      }
      else if (n <= 35)
      {
        return ((char)(65 + n - 10)).ToString();
      }
      else
      {
        return ((char)(97 + n - 36)).ToString();
      }
    }
    #endregion

    #region 獲得隨機字體
    /// <summary>
    /// 獲得隨機字體
    /// </summary>
    private static Font GetFont(Random rnd)
    {
      return new Font(fonts[rnd.Next(0, fonts.Length)], fontSize, FontStyle.Bold);
    }
    #endregion

    #region 獲得隨機色彩
    /// <summary>
    /// 獲得隨機色彩
    /// </summary>
    private static Color GetColor(Random rnd)
    {
      return colors[rnd.Next(0, colors.Length)];
    }
    #endregion

    #region 正弦曲線Wave歪曲圖片
    /// <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>  
    private static 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), 0, 0, destBmp.Width, destBmp.Height);
      graph.Dispose();

      double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width;

      for (int i = 0; i < destBmp.Width; i++)
      {
        for (int j = 0; j < destBmp.Height; j++)
        {
          double dx = 0;
          dx = bXDir ? (Math.PI * 2 * (double)j) / dBaseAxisLen : (Math.PI * 2 * (double)i) / dBaseAxisLen;
          dx += dPhase;
          double dy = Math.Sin(dx);

          // 獲得以後點的色彩  
          int nOldX = 0, nOldY = 0;
          nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
          nOldY = bXDir ? j : j + (int)(dy * dMultValue);

          System.Drawing.Color color = srcBmp.GetPixel(i, j);
          if (nOldX >= 0 && nOldX < destBmp.Width
           && nOldY >= 0 && nOldY < destBmp.Height)
          {
            destBmp.SetPixel(nOldX, nOldY, color);
          }
        }
      }

      return destBmp;
    }
    #endregion

  }
}

驗證碼頁面Action:

public ActionResult VerifyCode()
{
  string code;
  Bitmap bmp = VerifyCodeHelper.CreateVerifyCodeBmp(out code);
  Bitmap newbmp = new Bitmap(bmp, 108, 36);
  HttpContext.Session["VerifyCode"] = code;

  Response.Clear();
  Response.ContentType = "image/bmp";
  newbmp.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Bmp);

  return View();
}

解釋:前台頁面為空的cshtml頁面,驗證碼的值放在Session中。

應用驗證碼的頁面:

顯示驗證碼的img:

<img id="verifyCode" src="" alt="驗證碼" />
頁面加載完成後,顯示驗證碼(留意,要加上時光戳,否則刷新頁面時驗證碼不刷新):

$(function () {
  //刷新驗證碼
  $("#refreshVerifyCode").click(function () {
    refreshVerifyCode(); //刷新驗證碼
  });
  $("#verifyCode").click(function () {
    refreshVerifyCode(); //刷新驗證碼
  });
  refreshVerifyCode();
});

刷新驗證碼:

//刷新驗證碼
function refreshVerifyCode() {
  $("#verifyCode").attr("src", "VerifyCode?t=" + new Date().valueOf());
}
 

斷定用戶輸出的文本能否與驗證碼雷同的Action:

public ActionResult CheckVCode(string vcode)
{
  if (HttpContext.Session["VerifyCode"].ToString().ToLower() == vcode.ToLower())
  {
    Dictionary<string, object> dic = new Dictionary<string, object>();
    dic["ok"] = true;
    return Content(JsonConvert.SerializeObject(dic));
  }
  else
  {
    Dictionary<string, object> dic = new Dictionary<string, object>();
    dic["ok"] = false;
    return Content(JsonConvert.SerializeObject(dic));
  }
}

以上就是本文的全體內容,願望對年夜家進修C#生成驗證碼的辦法有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved