/// <summary>產生圖形驗證的圖片</summary>
[WebMethod(EnableSession = true)]
public string CreateCaptcha() {
// 存放用來產生亂數的檔名規則
string[] Codes = "A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z,2,3,4,5,6,7,8,9".Split(',');
// 存放產生亂數後的檔名
string CaptchaCode = "";
// 宣告一個亂數個體
Random RadomCode = new Random();
// 用來存放最後壓縮產生出來的驗證圖片
Image[] CaptchaData = null;
// 用來存放最後產生出來的驗證圖片
Image ImageCaptcha = null;
// 用來存放亂數產生出來的圖形
List<Image> CaptchaImage = new List<Image>();
// 用來存放驗證碼
string VerifyCode = "";
// 用來存放轉陣列的圖片
byte[] imageBytes = null;
// 用來存放Base64 Code
string Base64String = "";
// 加入底圖
CaptchaImage.Add(Image.FromFile(Server.MapPath("~/") + "/Images/VerifyImage/Background.png"));
// 亂數產生4張圖片
for (int Index = 1; Index <= 4; Index++) {
// 亂數產生檔名
CaptchaCode += Codes[RadomCode.Next(32)];
// 紀錄驗證碼
VerifyCode += CaptchaCode;
// 產生出檔名並找到指定位置檔案存放至List
CaptchaImage.Add(Image.FromFile(Server.MapPath("~/") + "/Images/VerifyImage/" + Index + CaptchaCode + ".png"));
// 清空暫存資訊
CaptchaCode = "";
}
// 把圖片List轉成Array
CaptchaData = CaptchaImage.ToArray();
// 合併圖片
ImageCaptcha = this.UniteImage(100, 30, CaptchaData);
// 紀錄驗證碼到session
HttpContext.Current.Session[SessionKey.Captcha] = VerifyCode;
// 使用MemoryStream存放圖片
using (MemoryStream MemoryStr = new MemoryStream()) {
// 將圖檔存進MemoryStream並指定格式為png
ImageCaptcha.Save(MemoryStr, ImageFormat.Png);
// 將圖檔轉陣列存入
imageBytes = MemoryStr.ToArray();
// 將圖片轉成Base64並存放入Base64String字串中
Base64String = Convert.ToBase64String(imageBytes);
// 回傳字串
return Base64String;
}
}
/// <summary>合併圖片</summary>
/// <param name="paramWidth">傳入合併後的圖片寬度</param>
/// <param name="paramHeight">傳入合併後的圖片高度</param>
/// <param name="paramImgs">傳入要合併的圖片陣列</param>
/// <returns>將回傳整合後的圖片</returns>
public System.Drawing.Image UniteImage(Int32 paramWidth, Int32 paramHeight, System.Drawing.Image[] paramImgs) {
//用來紀錄要回傳的圖片
System.Drawing.Image ReturnImg = new System.Drawing.Bitmap(paramWidth, paramHeight);
//用來處理整合圖像的物件
System.Drawing.Graphics GraphicsTemp = System.Drawing.Graphics.FromImage(ReturnImg);
//指定要清除的色系
GraphicsTemp.Clear(System.Drawing.Color.Transparent);
//加入圖案
for (Int32 Index = 0; Index <= paramImgs.GetLength(0) - 1; Index++) {
GraphicsTemp.DrawImage(paramImgs[Index], 0, 0, paramImgs[Index].Width, paramImgs[Index].Height);
}
return ReturnImg;
}