验证码技术de个人研究

perpass 2008-09-17 07:47:09
最近对验证码很感兴趣,只是不是很了解其中的某些技术,做了个很简单的实现
(因为找不到现成的参考代码,下面的仅仅是我的猜测,具体实现技术我不知道):
//显示验证码的图片大小
Bitmap pic = new Bitmap(65, 30);
Graphics grf = Graphics.FromImage(pic);
grf.Clear(Color.Red);
SolidBrush sb = new SolidBrush(Color.Yellow);
Pen p = new Pen(Color.Yellow, 18);
grf.DrawString("1234", new Font("Consolas", 18, FontStyle.Bold), sb, new PointF(1, 1));
//想增加阅读难度
for (int i = 1; i < 30; i++)
{
Random rad = new Random();
int posX = rad.Next(64);
int posY = rad.Next(29);
pic.SetPixel(posX, posY, Color.White);
}
pic.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);

问题很快就出现了:
1):发现只画了一个干扰白点,而不是计划的30个..
2):如何将生成的图像显示到一个图片控件(我猜测是显示在<img />控件中)?
下面是在某站点摘录的代码:
<label>验证码:</label>
<input type="text" name="verifycode" id="verifycode" class="ipt_tx" style="width:65px;" tabindex="3" >

<img id="verifycodeImg" src="http://verify.xunlei.com/image" /> <a href="javascript:void(0);" onclick="setVerifyCode($('verifycodeImg'));return false;"><img src="/img/btn_refresh.gif" /></a>
...全文
39 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
endyli 2008-09-17
  • 打赏
  • 举报
回复
使用:<img src="VerifyCode.aspx" align="absmiddle" />

VerifyCode.aspx页面
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Drawing" %>
<script runat="server">

private void Page_Load(object sender, EventArgs e)
{
//生成验证code
Random rand = new Random();
string n = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string VNum = "";

for (int i = 0; i < 4; i++)
{
VNum += n[rand.Next(0, 36)];
}

this.Session["ValiDateCode"] = VNum.ToLower();


//画验证码
System.Drawing.Bitmap img;
System.Drawing.Graphics g;
System.IO.MemoryStream ms;
int gheight = Convert.ToInt32(VNum.Length * 11); //gheight为图片宽度,根据字符长度自动更改图片宽度
img = new Bitmap(gheight, 18);
g = Graphics.FromImage(img);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
g.Clear(Color.White);

for (int i = 0; i <= 49; i++) //随机干扰点
{
int x = rand.Next(img.Width);
int y = rand.Next(img.Height);
g.DrawRectangle(new Pen(Color.Cornsilk, 0), x, y, 1, 1);
}

for (int j = 0; j <= 25; j++) //随机干扰线
{
int x1 = rand.Next(img.Width);
int x2 = rand.Next(img.Width);
int y1 = rand.Next(img.Height);
int y2 = rand.Next(img.Height);
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}


Font Fontss = new System.Drawing.Font("Arial", 10, FontStyle.Bold);
System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Green, Color.Red, 1.2F, true);

g.DrawString(VNum, Fontss, brush, 1, 1); //在矩形内绘制字串(字串,字体,画笔颜色,左上x.左上y)
g.DrawRectangle(new Pen(Color.Gray, 0), 0, 0, img.Width - 1, img.Height - 1); //加了个边框
ms = new System.IO.MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
Response.ClearContent(); //需要输出图象信息 要修改HTTP头
Response.ContentType = "image/Png";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
img.Dispose();
Response.End();
}
</script>
perpass 2008-09-17
  • 打赏
  • 举报
回复
1楼什么意思呀?
yyixin 2008-09-17
  • 打赏
  • 举报
回复
升上去

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧