GDI+ 实例:绘制验证码
一、概述
一般处理程序 ashx :它没有服务器控件,用response输出什么就是什么。
生成验证码原理:产生随机字符,并将字符生成为图片,同时储存到Session里去,然后验证用户输入的内容是否与Session中的验证码相符即可。
效果图:用户可以点击切换验证码信息。

二、一般处理程序
public class CheckCodeHandler : IHttpHandler, IRequiresSessionState//使用到Session,需要实现此接口IRequiresSessionState
{
private int intLength = 5; //长度
private string strIdentify = "Identify"; //随机字串存储键值,以便存储到Session中 /// <summary>
/// 生成验证图片核心代码
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(HttpContext context)
{
//背景用白色填充
Bitmap map = new Bitmap(200, 60);
Graphics g = Graphics.FromImage(map);
g.FillRectangle(new SolidBrush(Color.White), 0, 0, 200, 60); //将随机生成的字符串绘制到图片上
string letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
Random r = new Random();
StringBuilder s = new StringBuilder();
Font font = new Font(FontFamily.GenericSerif, 48, FontStyle.Bold, GraphicsUnit.Pixel); for (int i = 0; i < intLength; i++)
{
s.Append(letters.Substring(r.Next(0, letters.Length - 1), 1));
g.DrawString(s[s.Length - 1].ToString(), font, new SolidBrush(Color.Blue), i * 38, r.Next(0, 15));
}
font.Dispose();
context.Session[strIdentify] = s.ToString(); //先保存在Session中,验证与用户输入是否一致 //生成干扰线条,混淆背景
Pen pen = new Pen(new SolidBrush(Color.Blue), 2);
for (int i = 0; i < 10; i++)
{
g.DrawLine(pen, new Point(r.Next(0, 199), r.Next(0, 59)), new Point(r.Next(0, 199), r.Next(0, 59)));
}
pen.Dispose(); //设置输出流图片格式
context.Response.ContentType = "image/gif";
map.Save(context.Response.OutputStream, ImageFormat.Gif);
map.Dispose(); context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
三、在页面调用
<img src="CheckCodeHandler.ashx" alt="验证码" style="width: 60px; height: 24px" />
if (this.TextBox1.Text.ToUpper().Trim() != Session["strIdentify"].ToString().ToUpper().Trim())
{
Response.Write("<script>alert('验证码不正确')</script>");
}
else
{
Response.Write("<script>alert('登录成功')</script>");
}
GDI+ 实例:绘制验证码的更多相关文章
- GDI+在绘制验证码中的使用
GDI+最简单的理解就是用来绘图的.其中包括点.直线.矩形.字符串等等. 先简单来个例子,说明如何在winform窗体中绘制一条直线,并且这条直线不随着窗体的移动而消失. using System; ...
- 通过GDI+绘制 验证码
只为了记录下自己的学习历程,方便日后查看 现在开始言归正传,以下为其完整代码附上 using System; using System.Collections.Generic; using Syste ...
- C#验证码 使用GDI绘制验证码
首先展示一下效果图如下: C#中的GDI特别方便,很多方法我们只要简单的调用就可以实现很复杂的功能.具体实现过程如下: 首先创建一个windows窗体应用(测试使用,实际开发winform程序时在需要 ...
- 利用GDI+在Winfrom绘制验证码
string yzm: private void yangzhengma() { Bitmap bt = new Bitmap(70,22);//创建位图对象 Graphics gs = Graphi ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- 笔记11:GDI 制作数字验证码
大二学长让我学下GDI绘制验证码,然后自己就试了试了.找了点视频看了下. 现在会画直线,矩形,字符串,制作验证码 一.绘制一条直线 private void button1_Click(object ...
- 如何用GDI+画个验证码
如何使用GDI+来制作一个随机的验证码 绘制验证码之前先要引用 using System.Drawing; using System.Drawing.Drawing2D; 首先,先写一个方法来取得验证 ...
- GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)
带插件的排序算法演示器 请尊重本人的工作成果,转载请留言.并说明转载地址,谢谢. 地址例如以下: http://blog.csdn.net/fukainankai/article/details/27 ...
- C#中的GDI+图形绘制方法
GDI+图形绘制方法 1.首先对于绘制图形,必须的先将命名空间导入:using System.Drawing.Drawing2D; 2.然后在一个事件中写入程序 首先先将Graphics这个对象实例化 ...
- gdi+ 高速绘制透明窗体
gdi+ 高速绘制透明窗体: 方法一: 1.用Iamge对象载入png资源, 2.调用drawimage函数讲图片绘制出了 3.UpdateLayeredWindow对窗体进行布局 方法二: 1.用B ...
随机推荐
- [转帖]PG语法解剖--基本sql语句用法入门
PG语法解剖--基本sql语句用法入门 https://www.toutiao.com/i6710897833953722894/ COPY 命令挺好的 需要学习一下. 原创 波波说运维 2019-0 ...
- 【转帖】Linux 内核系统架构
Linux 内核系统架构 描述Linux内核的文章已经有上亿字了 但是对于初学者,还是应该多学习多看,毕竟上亿字不能一下子就明白的. 即使看了所有的Linux 内核文章,估计也还不是很明白,这时候 ...
- Java与计算机常识
DB2 IBM公司的数据库 Oracle Orcle的数据库 Mysql 数据库(免费) 1. jetty 小型服务器(类似于tomcat) Jetty 是一个开源的servlet ...
- P3205 [HNOI2010]合唱队
题目点这里 题面: 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为Hi米(1000<=Hi ...
- 剑指offer51:构建乘积数组B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1],不能使用除法
1 题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1] ...
- Activate注解
Activate注解 被该注解修饰的接口,扩展类可能会被加载 ProtocolFilterWrapper.buildInvokerChain @Documented @Retention(Retent ...
- //统计报表-供水量统计主列表分页查询 Element-ui的分页插件
<!-- //分页 --> <div class="pagination">时间(月) <el-pagination @current-change= ...
- 怎样理解数组的空元素empty与undefined的区别
数组的空元素empty表示空位, 它不是一种数据类型, 而是由于人为修改arr.length 或者写入时多写了逗号造成的. var arr = [1,2,3,4,,,5]; arr.length; a ...
- (一)easyUI之第一个demo
一.下载 官网下载 : http://www.jeasyui.net/download/ 同时并下载官方中文API文档. 解压后的目录结构: 二.第一个demo 1 新建工程并导入包 2 ...
- C# XML 序列化帮助类
/// <summary> /// Xml helper class /// </summary> public static class XmlHelper { #regio ...