checkimage.ASPx
首先根據上節課程的內容,我們要創建一 個圖片服務頁面,專門用於提供包含驗證碼文本的圖片,為此我們建立一個 checkimage.ASPx 的頁面。其Html代碼很簡單,只有一行,不輸出任何內容。在其Page_Load 方法中就有創建驗證碼圖片的過程。
// 創建一個包含隨機內容的驗證碼文本
System.Random rand = new Random();
int len = rand.Next(4 , 6 );
char[] chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray ();
System.Text.StringBuilder myStr = new System.Text.StringBuilder();
for( int iCount = 0 ; iCount < len ; iCount ++ )
{
myStr.Append( chars[ rand.Next( chars.Length )]);
}
string text = myStr.ToString();
// 保存驗證碼到 session 中以便其他模塊使用
this.Session["checkcode"] = text ;
Size ImageSize = Size.Empty ;
Font myFont = new Font("MS Sans Serif" , 20 );
// 計算驗證 碼圖片大小
using( Bitmap bmp = new Bitmap( 10 , 10 ))
{
using( Graphics g = Graphics.FromImage( bmp ))
{
SizeF size = g.MeasureString( text , myFont , 10000 );
ImageSize.Width = ( int ) size.Width + 8 ;
ImageSize.Height = ( int ) size.Height + 8 ;
}
}
// 創建驗證碼圖片
using( Bitmap bmp = new Bitmap( ImageSize.Width , ImageSize.Height ))
{
// 繪制驗證碼文本
using( Graphics g = Graphics.FromImage( bmp ))
{
g.Clear( Color.White );
using( StringFormat f = new StringFormat())
{
f.Alignment = StringAlignment.Near ;
f.LineAlignment = StringAlignment.Center ;
f.FormatFlags = StringFormatFlags.NoWrap ;
g.DrawString(
text ,
myFont ,
Brushes.Black ,
new RectangleF(
0 ,
0 ,
ImageSize.Width ,
ImageSize.Height ),
f );
}//using
}//using
// 制造噪聲 雜點面積占圖片面積的 30%
int num = ImageSize.Width * ImageSize.Height * 30 / 100 ;
for( int iCount = 0 ; iCount < num ; iCount ++ )
{
// 在隨機的位置使用隨機的顏色設置圖片的像素
int x = rand.Next( ImageSize.Width );
int y = rand.Next( ImageSize.Height );
int r = rand.Next( 255 );
int g = rand.Next( 255 );
int b = rand.Next( 255 );
Color c = Color.FromArgb( r , g , b );
bmp.SetPixel( x , y , c );
}//for
// 輸出圖片
System.IO.MemoryStream ms = new System.IO.MemoryStream();
bmp.Save( ms , System.Drawing.Imaging.ImageFormat.Png );
this.Response.ContentType = "image/png";
ms.WriteTo( this.Response.OutputStream );
ms.Close();
}//using
myFont.Dispose();