2014年11月12日 星期三

[C#]產生圖形驗證的圖片

/// <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;
        }


沒有留言:

張貼留言

[Laravel]環境架設,使用docker + laradock

1.選擇使用docker + laradock在windows10的環境使用 先至 docker官方網站 下載 docker for windows   2.依照執行程式下載安裝 這邊我的電腦有遇到一些問題順便記錄下來, 在下載啟動docker時發生錯誤   Hardw...