驗證碼是 Web 表單防刷的基礎組件。本文提供一個功能完整的 VerifyCode 類,支持自定義長度、字體、顏色、干擾點、正弦波扭曲,並可直接輸出圖片流到頁面,驗證碼值自動存入 Session。
public class VerifyCode
{
// 配置屬性
public int Length { get; set; } = 4; // 驗證碼長度
public int FontSize { get; set; } = 14; // 字體大小
public bool Chaos { get; set; } = true; // 是否生成干擾點
public Color ChaosColor { get; set; } = Color.LightGray;
public Color BackgroundColor { get; set; } = Color.White;
public int Padding { get; set; } = 2; // 邊距
public Color[] Colors { get; set; } = { ... }; // 字符顏色池
public string[] Fonts { get; set; } = { "Arial", "Georgia" };
public string CodeSerial { get; set; } = "0,1,2,...,Z"; // 字符集
// 核心方法
public string CreateVerifyCode(int codeLen = 0); // 生成隨機碼
public Bitmap CreateImageCode(string code); // 繪製圖片
public void CreateImageOnPage(string code, HttpContext context); // 輸出到 Response
private Bitmap TwistImage(Bitmap src, bool bXDir, double dMultValue, double dPhase); // 正弦波扭曲
}
<%@ Page Language="C#" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
VerifyCode v = new VerifyCode();
v.Length = 4;
v.FontSize = 14;
v.Chaos = true;
v.BackgroundColor = Color.White;
v.ChaosColor = Color.LightGray;
v.Padding = 2;
string code = v.CreateVerifyCode(); // 1. 生成隨機碼
v.CreateImageOnPage(code, this.Context); // 2. 直接輸出圖片流 (Content-Type: image/Jpeg)
Session["bao_code"] = code.ToUpper(); // 3. 存入 Session 供後續驗證
}
</script>
<img src="ValidateCode.aspx" id="captchaImg" style="cursor:pointer" title="點擊刷新" />
<input type="text" name="txtCode" />
<script>
document.getElementById('captchaImg').onclick = function() {
this.src = 'ValidateCode.aspx?' + Math.random(); // 防緩存刷新
};
</script>
TwistImage 方法對每個像素按正弦函數位移,生成波浪狀變形,有效對抗 OCR 識別。MemoryStream,再 BinaryWrite 到 Response,無需生成臨時文件。Dispose() Bitmap、Graphics、MemoryStream,防止內存洩漏。DrawLine)、噪音圓圈。這個類結構清晰、可擴展性強,可直接集成到 ASP.NET WebForms 或 MVC 控制器中,是學習 GDI+ 繪圖與驗證碼原理的優秀案例。