图片验证码生成

本文介绍了一种自动生成图片验证码的方法,并提供了详细的代码实现。该方法包括生成随机字符、绘制背景干扰线及像素点等步骤,确保了验证码的安全性和防破解能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        /// <summary>
        /// 自动生成图片验证码
        /// </summary>
        /// <param name="checkCode">返回的图片验证码</param>
        /// <param name="width">显示到客户端的图片宽度</param>
        /// <param name="height">显示到客户端的图片高度</param>
        /// <param name="checkCodeLength">验证码长度</param>
        /// <returns>流Stream返回</returns>
        public static byte[] CreateImgVidCode(ref string checkCode, int width = 124, int height = 40, int checkCodeLength = 5)
        {
            var rnd = new Random();
            char[] character = { '2', '3', '4', '5', '6', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'k', 'm', 'p', 'q', 'w', 'r', 's', 't', 'v', 'x', 'y', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' };
            checkCode = string.Empty;
            var checkCodeFontSize = 16;
            for (int i = 0; i < checkCodeLength; i++)
            {
                checkCode += character[rnd.Next(character.Length)];
            }
            using (Bitmap image = new Bitmap(width, height))
            using (Graphics graphic = Graphics.FromImage(image))
            {
                Random random = new Random();
                graphic.Clear(Color.White);
                int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
                for (int index = 0; index < 25; index++)
                {
                    x1 = random.Next(image.Width);
                    x2 = random.Next(image.Width);
                    y1 = random.Next(image.Height);
                    y2 = random.Next(image.Height);

                    graphic.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
                }
                StringFormat stringFormat = new StringFormat();
                stringFormat.LineAlignment = StringAlignment.Center;
                stringFormat.Alignment = StringAlignment.Center;
                Rectangle lbRect = new Rectangle((width - 16 * checkCodeLength) / 6, (height - checkCodeFontSize) / 6, width, height);

                Font font = new Font("Arial", checkCodeFontSize, (FontStyle.Bold | FontStyle.Italic));
                LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Red, Color.DarkRed, 1.2f, true);
                graphic.DrawString(checkCode, font, brush, lbRect, stringFormat);
                int x = 0;
                int y = 0;
                for (int i = 0; i < 100; i++)
                {
                    x = random.Next(image.Width);
                    y = random.Next(image.Height);
                    image.SetPixel(x, y, Color.FromArgb(random.Next()));
                }
                graphic.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
                using (var ms = new System.IO.MemoryStream())
                {
                    image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                    return ms.ToArray();
                }
            }

        }


===========================

=======html
                    <div class="n-input-box list-input2">
                        <label class="verification">
                            <i></i>
                            <input name="ImgVidCode" id="ImgVidCode" type="text" placeholder="请输入图形验证码" />
                        </label>
                        <img src="@Url.Action("CreateImgVidCode", "MemMember", new { vt = "R" })" width="124" height="40" alt="" onclick="this.src = this.src + '?'" style="cursor:pointer">
                        @*<p class="error" id="ImgCodeErrMsg"></p>*@
                        @Html.Raw("<p class='error' id='ImgCodeErrMsg'>" + System.Web.HttpUtility.HtmlDecode(Html.ValidationMessage("ImgCodeErrMsg", new { @class = "error" }).ToString()) + "</p>")
                    </div>


====controller
        /// 功能:图片验证码(5分钟内有效)
        /// </summary>
        /// <param name="vt">类型:L:登录;R:注册;S:设置交易密码;F:找回密码;B:绑定新手机</param>
        /// <returns></returns>
        public FileResult CreateImgVidCode(string vt = "L")
        {
            //验证码
            var code = string.Empty;
            //压力测试
            //var code = "666666";
            //对应的键
            var cacheKey = string.Empty;
            vt = vt.ToUpper().Replace("?", "");
            switch (vt)
            {
                default:
                case "L":
                    cacheKey = base.LoginImgVidCodeCacheKey;
                    break;
                case "R":
                    cacheKey = base.RegisterImgVidCodeCacheKey;
                    break;
                case "F":
                    cacheKey = base.FindPwdImgVidCodeCacheKey;
                    break;
                case "S":
                    cacheKey = base.SetPayPassWordMsgVidCodeCacheKey;
                    break;
                case "B":
                    cacheKey = base.BindingNewPhoneCacheKey;
                    break;
            }
            //取6位验证码或者5位
            var s = vt.Equals("L") || vt.Equals("F") || vt.Equals("S") || vt.Equals("B") ? CodeHelpers.CreateImgVidCode(ref code, checkCodeLength: 6) : CodeHelpers.CreateImgVidCode(ref code);
            //压力测试
            //var s = ClientHelper.CreateImgVidCode(code);
            //缓存验证码
            //HK.CM.Web.Utility.Common.CacheHelpers.set
            HKSJ.Common.DataCache.SetCache(cacheKey, code, DateTime.Now.AddMinutes(5), TimeSpan.Zero);
            return File(s, "image/Jpeg");
        }







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值