201 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			201 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using System; | |||
|  | using System.Drawing; | |||
|  | using System.Drawing.Drawing2D; | |||
|  | using System.Drawing.Imaging; | |||
|  | using System.Drawing.Text; | |||
|  | 
 | |||
|  | 
 | |||
|  | namespace CaptchaImage | |||
|  | { | |||
|  |     /// <summary> | |||
|  |     /// 这个生成验证码图片的代码来自:http://www.codeproject.com/KB/aspnet/CaptchaImage.aspx | |||
|  |     /// </summary> | |||
|  |     public class CaptchaImage | |||
|  |     { | |||
|  |         // Public properties (all read-only). | |||
|  |         public string Text | |||
|  |         { | |||
|  |             get { return this.text; } | |||
|  |         } | |||
|  |         public Bitmap Image | |||
|  |         { | |||
|  |             get { return this.image; } | |||
|  |         } | |||
|  |         public int Width | |||
|  |         { | |||
|  |             get { return this.width; } | |||
|  |         } | |||
|  |         public int Height | |||
|  |         { | |||
|  |             get { return this.height; } | |||
|  |         } | |||
|  | 
 | |||
|  |         // Internal properties. | |||
|  |         private string text; | |||
|  |         private int width; | |||
|  |         private int height; | |||
|  |         private string familyName; | |||
|  |         private Bitmap image; | |||
|  | 
 | |||
|  |         // For generating random numbers. | |||
|  |         private Random random = new Random(); | |||
|  | 
 | |||
|  |         // ==================================================================== | |||
|  |         // Initializes a new instance of the CaptchaImage class using the | |||
|  |         // specified text, width and height. | |||
|  |         // ==================================================================== | |||
|  |         public CaptchaImage(string s, int width, int height) | |||
|  |         { | |||
|  |             this.text = s; | |||
|  |             this.SetDimensions(width, height); | |||
|  |             this.GenerateImage(); | |||
|  |         } | |||
|  | 
 | |||
|  |         // ==================================================================== | |||
|  |         // Initializes a new instance of the CaptchaImage class using the | |||
|  |         // specified text, width, height and font family. | |||
|  |         // ==================================================================== | |||
|  |         public CaptchaImage(string s, int width, int height, string familyName) | |||
|  |         { | |||
|  |             this.text = s; | |||
|  |             this.SetDimensions(width, height); | |||
|  |             this.SetFamilyName(familyName); | |||
|  |             this.GenerateImage(); | |||
|  |         } | |||
|  | 
 | |||
|  |         // ==================================================================== | |||
|  |         // This member overrides Object.Finalize. | |||
|  |         // ==================================================================== | |||
|  |         ~CaptchaImage() | |||
|  |         { | |||
|  |             Dispose(false); | |||
|  |         } | |||
|  | 
 | |||
|  |         // ==================================================================== | |||
|  |         // Releases all resources used by this object. | |||
|  |         // ==================================================================== | |||
|  |         public void Dispose() | |||
|  |         { | |||
|  |             GC.SuppressFinalize(this); | |||
|  |             this.Dispose(true); | |||
|  |         } | |||
|  | 
 | |||
|  |         // ==================================================================== | |||
|  |         // Custom Dispose method to clean up unmanaged resources. | |||
|  |         // ==================================================================== | |||
|  |         protected virtual void Dispose(bool disposing) | |||
|  |         { | |||
|  |             if (disposing) | |||
|  |                 // Dispose of the bitmap. | |||
|  |                 this.image.Dispose(); | |||
|  |         } | |||
|  | 
 | |||
|  |         // ==================================================================== | |||
|  |         // Sets the image width and height. | |||
|  |         // ==================================================================== | |||
|  |         private void SetDimensions(int width, int height) | |||
|  |         { | |||
|  |             // Check the width and height. | |||
|  |             if (width <= 0) | |||
|  |                 throw new ArgumentOutOfRangeException("width", width, "Argument out of range, must be greater than zero."); | |||
|  |             if (height <= 0) | |||
|  |                 throw new ArgumentOutOfRangeException("height", height, "Argument out of range, must be greater than zero."); | |||
|  |             this.width = width; | |||
|  |             this.height = height; | |||
|  |         } | |||
|  | 
 | |||
|  |         // ==================================================================== | |||
|  |         // Sets the font used for the image text. | |||
|  |         // ==================================================================== | |||
|  |         private void SetFamilyName(string familyName) | |||
|  |         { | |||
|  |             // If the named font is not installed, default to a system font. | |||
|  |             try | |||
|  |             { | |||
|  |                 Font font = new Font(this.familyName, 13F); | |||
|  |                 this.familyName = familyName; | |||
|  |                 font.Dispose(); | |||
|  |             } | |||
|  |             catch (Exception) | |||
|  |             { | |||
|  |                 this.familyName = System.Drawing.FontFamily.GenericSerif.Name; | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         // ==================================================================== | |||
|  |         // Creates the bitmap image. | |||
|  |         // ==================================================================== | |||
|  |         private void GenerateImage() | |||
|  |         { | |||
|  |             // Create a new 32-bit bitmap image. | |||
|  |             Bitmap bitmap = new Bitmap(this.width, this.height, PixelFormat.Format32bppArgb); | |||
|  | 
 | |||
|  |             // Create a graphics object for drawing. | |||
|  |             Graphics g = Graphics.FromImage(bitmap); | |||
|  |             g.SmoothingMode = SmoothingMode.AntiAlias; | |||
|  |             Rectangle rect = new Rectangle(0, 0, this.width, this.height); | |||
|  | 
 | |||
|  |             // Fill in the background. | |||
|  |             HatchBrush hatchBrush = new HatchBrush(HatchStyle.SmallConfetti, Color.LightGray, Color.White); | |||
|  |             g.FillRectangle(hatchBrush, rect); | |||
|  | 
 | |||
|  |             // Set up the text font. | |||
|  |             SizeF size; | |||
|  |             float fontSize = rect.Height + 1; | |||
|  |             Font font; | |||
|  |             // Adjust the font size until the text fits within the image. | |||
|  |             do | |||
|  |             { | |||
|  |                 fontSize--; | |||
|  |                 font = new Font(this.familyName, fontSize, FontStyle.Bold); | |||
|  |                 size = g.MeasureString(this.text, font); | |||
|  |             } while (size.Width > rect.Width); | |||
|  | 
 | |||
|  |             // Set up the text format. | |||
|  |             StringFormat format = new StringFormat | |||
|  |             { | |||
|  |                 Alignment = StringAlignment.Center, | |||
|  |                 LineAlignment = StringAlignment.Center | |||
|  |             }; | |||
|  | 
 | |||
|  |             // Create a path using the text and warp it randomly. | |||
|  |             GraphicsPath path = new GraphicsPath(); | |||
|  |             path.AddString(this.text, font.FontFamily, (int)font.Style, font.Size, rect, format); | |||
|  |             float v = 8F; | |||
|  |             PointF[] points = | |||
|  | 			{ | |||
|  | 				new PointF(this.random.Next(rect.Width) / v, this.random.Next(rect.Height) / v), | |||
|  | 				new PointF(rect.Width - this.random.Next(rect.Width) / v, this.random.Next(rect.Height) / v), | |||
|  | 				new PointF(this.random.Next(rect.Width) / v, rect.Height - this.random.Next(rect.Height) / v), | |||
|  | 				new PointF(rect.Width - this.random.Next(rect.Width) / v, rect.Height - this.random.Next(rect.Height) / v) | |||
|  | 			}; | |||
|  |             Matrix matrix = new Matrix(); | |||
|  |             matrix.Translate(0F, 0F); | |||
|  |             path.Warp(points, rect, matrix, WarpMode.Perspective, 0F); | |||
|  | 
 | |||
|  |             // Draw the text. | |||
|  |             hatchBrush = new HatchBrush(HatchStyle.LargeConfetti, Color.Green, Color.DarkGray); | |||
|  |             g.FillPath(hatchBrush, path); | |||
|  | 
 | |||
|  |             // Add some random noise. | |||
|  |             int m = Math.Max(rect.Width, rect.Height); | |||
|  |             for (int i = 0; i < (int)(rect.Width * rect.Height / 30F); i++) | |||
|  |             { | |||
|  |                 int x = this.random.Next(rect.Width); | |||
|  |                 int y = this.random.Next(rect.Height); | |||
|  |                 int w = this.random.Next(m / 50); | |||
|  |                 int h = this.random.Next(m / 50); | |||
|  |                 g.FillEllipse(hatchBrush, x, y, w, h); | |||
|  |             } | |||
|  | 
 | |||
|  |             // Clean up. | |||
|  |             font.Dispose(); | |||
|  |             hatchBrush.Dispose(); | |||
|  |             g.Dispose(); | |||
|  | 
 | |||
|  |             // Set the image. | |||
|  |             this.image = bitmap; | |||
|  |         } | |||
|  |     } | |||
|  | } |