با سلام و با تشکر؛ با اجازه بنده کد فوق رو کاملتر کردم و یک سری کد جدید بهش اضافه کردم و برخی بخشها رو هم تغییر داده ام:
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>
محتوای کلاس CustomRandom :
این کلاس به تعداد مورد نیاز کاراکتر عددی/عددی-حروفی میسازه و به شما تحویل میده
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 رو به خود دوستان واگذار میکنم تا با هر الگوریتمی که دوست دارن این کار رو انجام بدن. (
^)
امیدوارم کد بنده به دوستان کمک کنه.
موفق باشید