با سلام و با تشکر؛ با اجازه بنده کد فوق رو کاملتر کردم و یک سری کد جدید بهش اضافه کردم و برخی بخشها رو هم تغییر داده ام:
برای استفاده هم داریم :
محتوای کلاس CustomRandom :
1- به جای سوال ، بنده یک عبارت رو نمایش میدم
2- ارسال دیتا از طریق کوئری استرینگ که باعث میشه سشن دیگه نیاز نباشه و از مصرف حافظه رو تا حد زیادی کاسته بشه.
البته این مورد برای سایتهای پربازدید خیلی قابل لمس است و ممکنه روی سایتهای معمولی تفاوت زیادی احساس نشه.
3- ارسال داده بصورت هش شده ، که این رو بنده خودم با یک کلاس دست ساز معمولی به روش TripleDes انجام داده ام که دوستان به هر روشی میتونن داده هاشون رو هش کنن.
4- یکم حروف رو چرخوندم و فاصله بین حروف رو هم طوری تنظیم کردم که در عرض تصویر پخش بشن (از کل عرض تصویر استفاده بشه)
* شایان ذکر است که به نظر من روش فوق در ایجاد نویزهای دایره ای بسیار زیبا بود، چون همیشه همه جا با یک سری خط ساده نویز ایجاد میکنن ولی روش فوق واقعا خلاقانه و قشنگ بود :)
ساختار کنترلر ریکپچای من :
public class CaptchaController : Controller { private static readonly Brush ForeColor = Brushes.Black; private const string FontName = "tahoma"; private const int FontSize = 14; private const int Width = 130; private const int Height = 35; [HttpGet] public ActionResult Image(string cc) { if (string.IsNullOrEmpty(cc) || string.IsNullOrWhiteSpace(cc)) return null; var captchaData = CustomHashing.DecryptTpl(cc); var rand = new Random((int)DateTime.Now.Ticks); // image stream FileContentResult img = null; using (var mem = new MemoryStream()) using (var bmp = new Bitmap(Width, Height)) using (var mtrx = new Matrix()) using (var gfx = Graphics.FromImage((Image)bmp)) { gfx.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; gfx.SmoothingMode = SmoothingMode.AntiAlias; gfx.FillRectangle(Brushes.White, new Rectangle(0, 0, bmp.Width, bmp.Height)); //add noise int rn, xn, yn; var pen = new Pen(Color.Yellow); for (int i = 1; i < 10; i++) { pen.Color = Color.FromArgb((rand.Next(0, 255)), (rand.Next(0, 255)), (rand.Next(0, 255))); rn = rand.Next(0, (130 / 3)); xn = rand.Next(0, 130); yn = rand.Next(0, 30); gfx.DrawEllipse(pen, xn - rn, yn - rn, rn, rn); } //add chars #region draw pic float x = 1, y = 1; int degree = 10; for (int i = 0; i < captchaData.Length; i++) { mtrx.Reset(); x = (float)(Width * (0.19 * i)); y = (float)(Height * 0.19); degree = rand.Next(-25, 25); if (i == 0 && degree > 20) { x += (FontSize + 5); y -= 15; } mtrx.RotateAt(degree, new PointF(x, y)); gfx.Transform = mtrx; gfx.DrawString(captchaData[i].ToString(), new Font(FontName, FontSize), ForeColor, x, y); gfx.ResetTransform(); } #endregion //render as Jpeg bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg); img = this.File(mem.GetBuffer(), "image/Jpeg"); } return img; }
@{ var r = new Web.Tools.CustomRandom(); string hash = Web.Tools.CustomHashing.EncryptTpl(r.CraeteCapchaNumericData(4)); } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>test Index</title> </head> <body> <div> <img src="@Url.Action("Image", "Captcha", new { cc = hash })" /> </div> </body> </html>
این کلاس به تعداد مورد نیاز کاراکتر عددی/عددی-حروفی میسازه و به شما تحویل میده
public class CustomRandom { /// <summary> /// ساخت یک عبارت عددی رندوم /// </summary> public string CraeteCapchaNumericData(int length) { var rnd = new Random((int) DateTime.Now.Ticks); var temp = new StringBuilder(); for (var i = 0; i < length; i++) temp.Append(Convert.ToChar(rnd.Next(49, 58))); return temp.ToString(); } /// <summary> /// ساخت یک عبارت رندوم /// </summary> public string CreateRandomName(int length) { var rnd = new Random((int) DateTime.Now.Ticks); var temp = new StringBuilder(); var flag = 1; for (var i = 0; i < length; i++) { flag = rnd.Next(0, 15); if (flag < 5) temp.Append(Convert.ToChar(rnd.Next(97, 123))); // lower else if (flag >= 5 && flag < 10) temp.Append(Convert.ToChar(rnd.Next(49, 58))); // numeric else temp.Append(Convert.ToChar(rnd.Next(65, 91))); // biger } return temp.ToString(); } }
همانطور که گفتم پیاده سازی متد های DecryptTpl و EncryptTpl کلاس CustomHashing رو به خود دوستان واگذار میکنم تا با هر الگوریتمی که دوست دارن این کار رو انجام بدن. (^)
امیدوارم کد بنده به دوستان کمک کنه.
موفق باشید