C# C/S 图片验证码功能源码

简介:

运行效果如图

用法如下:

/// <summary>
///  显示验证码
/// </summary>
/// <returns> 验证码 </returns>
private void  GetVerifyCode()
       {
           VerifyCodeImage verifyCodeImage 
= new  VerifyCodeImage();
//  取随机码
string  code  =  verifyCodeImage.CreateVerifyCode().ToUpper();
//  输出图片
this .picVerifyCode.Image  =  verifyCodeImage.CreateImage(code,  3 );
this .picVerifyCode.Tag  =  code;
       }


private void  picVerifyCode_DoubleClick( object  sender, EventArgs e)
       {
this .GetVerifyCode();
//  this.txtVerifyCode.Clear();
this .txtVerifyCode.SelectAll();
this .txtVerifyCode.Focus();
       }


源码如下:

// -----------------------------------------------------------------
//  All Rights Reserved , Copyright (C) 2011 , Hairihan TECH, Ltd. 
// -----------------------------------------------------------------

using  System;
using  System.Drawing;
using  System.Web;

namespace  DotNet.Utilities
{
public class  VerifyCodeImage
   {
public  VerifyCodeImage()
       {
       }

#region  验证码长度(默认4个验证码的长度)
int  length  = 4 ;
public int  Length
       {
get  {  return  length; }
set  { length  =  value; }
       }
#endregion

#region  验证码字体大小(为了显示扭曲效果,默认40像素,可以自行修改)
int  fontSize  = 50 ;
public int  FontSize
       {
get  {  return  fontSize; }
set  { fontSize  =  value; }
       }
#endregion

#region  边框补(默认1像素)
int  padding  = 2 ;
public int  Padding
       {
get  {  return  padding; }
set  { padding  =  value; }
       }
#endregion

#region  是否输出燥点(默认不输出)
bool  chaos  = true ;
public bool  Chaos
       {
get  {  return  chaos; }
set  { chaos  =  value; }
       }
#endregion

#region  输出燥点的颜色(默认灰色)
       Color chaosColor 
=  Color.LightGray;
public  Color ChaosColor
       {
get  {  return  chaosColor; }
set  { chaosColor  =  value; }
       }
#endregion

#region  自定义背景色(默认白色)
       Color backgroundColor 
=  Color.White;
public  Color BackgroundColor
       {
get  {  return  backgroundColor; }
set  { backgroundColor  =  value; }
       }
#endregion

#region  自定义随机颜色数组
       Color[] colors 
=  { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
public  Color[] Colors
       {
get  {  return  colors; }
set  { colors  =  value; }
       }
#endregion

#region  自定义字体数组
string [] fonts  =  {  " Arial " " Georgia "  };
public string [] Fonts
       {
get  {  return  fonts; }
set  { fonts  =  value; }
       }
#endregion

#region  自定义随机码字符串序列(使用逗号分隔)
//   去除 0,1,i,l,o,I,L,O
string  codeSerial  = " 2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,j,k,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,M,N,P,Q,R,S,T,U,V,W,X,Y,Z " ;
public string  CodeSerial
       {
get  {  return  codeSerial; }
set  { codeSerial  =  value; }
       }
#endregion

#region  产生波形滤镜效果
// private const double PI = 3.1415926535897932384626433832795;
private const double  PI2  = 6.283185307179586476925286766559 ;
/// <summary>
///  正弦曲线Wave扭曲图片(Edit By 51aspx.com)
/// </summary>
/// <param name="srcBmp"> 图片路径 </param>
/// <param name="bXDir"> 如果扭曲则选择为True </param>
/// <param name="nMultValue"> 波形的幅度倍数,越大扭曲的程度越高,一般为3 </param>
/// <param name="dPhase"> 波形的起始相位,取值区间[0-2*PI) </param>
/// <returns></returns>
public  System.Drawing.Bitmap TwistImage(Bitmap srcBmp,  bool  bXDir,  double  dMultValue,  double  dPhase)
       {
           System.Drawing.Bitmap bitmap 
= new  Bitmap(srcBmp.Width, srcBmp.Height);

//  将位图背景填充为白色
           System.Drawing.Graphics graphics  =  System.Drawing.Graphics.FromImage(bitmap);
           graphics.FillRectangle(
new  SolidBrush(System.Drawing.Color.White),  0 0 , bitmap.Width, bitmap.Height);
           graphics.Dispose();

double  dBaseAxisLen  =  bXDir  ?  ( double )bitmap.Height : ( double )bitmap.Width;

for  ( int  i  = 0 ; i  <  bitmap.Width; i ++ )
           {
for  ( int  j  = 0 ; j  <  bitmap.Height; j ++ )
               {
double  dx  = 0 ;
                   dx 
=  bXDir  ?  (PI2  *  ( double )j)  /  dBaseAxisLen : (PI2  *  ( double )i)  /  dBaseAxisLen;
                   dx 
+=  dPhase;
double  dy  =  Math.Sin(dx);

//  取得当前点的颜色
int  nOldX  = 0 , nOldY  = 0 ;
                   nOldX 
=  bXDir  ?  i  +  ( int )(dy  *  dMultValue) : i;
                   nOldY 
=  bXDir  ?  j : j  +  ( int )(dy  *  dMultValue);

                   System.Drawing.Color color 
=  srcBmp.GetPixel(i, j);
if  (nOldX  >= 0 &&  nOldX  <  bitmap.Width
&&  nOldY  >= 0 &&  nOldY  <  bitmap.Height)
                   {
                       bitmap.SetPixel(nOldX, nOldY, color);
                   }
               }
           }
return  bitmap;
       }
#endregion

#region  生成校验码图片
public  Bitmap CreateImage( string  code,  double  multValue)
       {
int  fSize  =  FontSize;
int  fWidth  =  fSize  +  Padding;

int  imageWidth  =  ( int )(code.Length  *  fWidth)  + 4 +  Padding  * 2 ;
int  imageHeight  =  fSize  * 2 +  Padding;

           System.Drawing.Bitmap bitmap 
= new  System.Drawing.Bitmap(imageWidth, imageHeight);

           Graphics graphics 
=  Graphics.FromImage(bitmap);

           graphics.Clear(BackgroundColor);

           Random rand 
= new  Random();

//  给背景添加随机生成的燥点
if  ( this .Chaos)
           {

               Pen pen 
= new  Pen(ChaosColor,  0 );
int  c  =  Length  * 10 ;

for  ( int  i  = 0 ; i  <  c; i ++ )
               {
int  x  =  rand.Next(bitmap.Width);
int  y  =  rand.Next(bitmap.Height);

                   graphics.DrawRectangle(pen, x, y, 
1 1 );
               }
           }

int  left  = 0 , top  = 0 , top1  = 1 , top2  = 1 ;

int  n1  =  (imageHeight  -  FontSize  -  Padding  * 2 );
int  n2  =  n1  / 4 ;
           top1 
=  n2;
           top2 
=  n2  * 2 ;

           Font font;
           Brush brush;

int  cindex, findex;

//  随机字体和颜色的验证码字符
for  ( int  i  = 0 ; i  <  code.Length; i ++ )
           {
               cindex 
=  rand.Next(Colors.Length  - 1 );
               findex 
=  rand.Next(Fonts.Length  - 1 );

               font 
= new  System.Drawing.Font(Fonts[findex], fSize, System.Drawing.FontStyle.Bold);
               brush 
= new  System.Drawing.SolidBrush(Colors[cindex]);

if  (i  % 2 == 1 )
               {
                   top 
=  top2;
               }
else
               {
                   top 
=  top1;
               }

               left 
=  i  *  fWidth;

               graphics.DrawString(code.Substring(i, 
1 ), font, brush, left, top);
           }

//  画一个边框 边框颜色为Color.Gainsboro
           graphics.DrawRectangle( new  Pen(Color.Gainsboro,  0 ),  0 0 , bitmap.Width  - 1 , bitmap.Height  - 1 );
           graphics.Dispose();

//  产生波形
           bitmap  =  TwistImage(bitmap,  true , multValue,  4 );

return  bitmap;
       }
#endregion

#region  生成随机字符码
public string  CreateVerifyCode( int  codeLength)
       {
if  (codeLength  == 0 )
           {
               codeLength 
=  Length;
           }
string [] arr  =  CodeSerial.Split( ' , ' );
string  code  = "" ;
int  randValue  = - 1 ;
           Random random 
= new  Random( unchecked (( int )DateTime.Now.Ticks));
for  ( int  i  = 0 ; i  <  codeLength; i ++ )
           {
               randValue 
=  random.Next( 0 , arr.Length  - 1 );
               code 
+=  arr[randValue];
           }
return  code;
       }

public string  CreateVerifyCode()
       {
return  CreateVerifyCode( 0 );
       }
#endregion


#region  将创建好的图片输出到页面
/// <summary>
///  将创建好的图片输出到页面
/// </summary>
/// <param name="code"> 验证码 </param>
/// <param name="multValue"> 扭曲度(越大越扭曲) </param>
/// <param name="httpContext"> 上下文 </param>
public void  CreateImageOnPage( string  code,  double  multValue, HttpContext httpContext)
       {
           System.IO.MemoryStream memoryStream 
= new  System.IO.MemoryStream();
           Bitmap bitmap 
= this .CreateImage(code, multValue);
           bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
           httpContext.Response.ClearContent();
           httpContext.Response.ContentType 
= " image/Jpeg " ;
           httpContext.Response.BinaryWrite(memoryStream.GetBuffer());

           memoryStream.Close();
           memoryStream 
= null ;
           bitmap.Dispose();
           bitmap 
= null ;
       }
#endregion
   }
}





本文转自 jirigala 51CTO博客,原文链接:http://blog.51cto.com/2347979/1197362,如需转载请自行联系原作者

相关文章
|
4月前
|
数据采集 JavaScript C#
C#图像爬虫实战:从Walmart网站下载图片
C#图像爬虫实战:从Walmart网站下载图片
|
2月前
|
JavaScript
vue实现移动端6格验证码源码
这是一个vue移动端6格验证码特效,可支持自动填充,根据项目需求,可将发送验证码功能抽离成单独的组件使用。简单好用,欢迎下载!
35 0
|
3月前
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
360 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
3月前
|
数据采集 自然语言处理 Python
用 Python 生成并识别图片验证码
用 Python 生成并识别图片验证码
68 1
|
5月前
|
SQL 前端开发 NoSQL
SpringBoot+Vue 实现图片验证码功能需求
这篇文章介绍了如何在SpringBoot+Vue项目中实现图片验证码功能,包括后端生成与校验验证码的方法以及前端展示验证码的实现步骤。
SpringBoot+Vue 实现图片验证码功能需求
|
6月前
|
存储 Oracle 关系型数据库
PACS源码,C#语言数字医学影像系统成品源码
**数字医学影像系统(RIS/PACS)**采用C#开发,基于C/S架构,配Oracle数据库,具备自主版权,适用于项目实施。系统包含分诊、超声、放射、内镜、病理等工作站,支持基本信息维护、报表查询和系统维护。功能亮点有:WorkList管理、影像采集传输、存储检索、图像处理、多序列浏览、流程控制、报告录入与审核、支持多种影像设备及高级影像处理。RIS与PACS数据库同步,并集成HIS、电子病历等系统接口。全面遵循DICOM3.0标准。
103 1
PACS源码,C#语言数字医学影像系统成品源码
|
6月前
|
BI 数据处理
一体化的医学实验室信息系统源码,C#LIS系统源码
面向医学实验室的一体化平台提供标本流程管理、报告发布及科室管理支持。它与HIS无缝对接,简化患者信息录入,实现检验结果实时同步。系统自动处理数据、分类样本、计算参考范围,并对异常结果预警。条码管理简化样本追踪,质控管理提升检测准确性。平台还支持数据审核发布、历史结果查询对比、灵活报表打印及统计分析等功能,辅助科室管理和试剂库存控制,加强科室间沟通协作。
一体化的医学实验室信息系统源码,C#LIS系统源码
|
6月前
|
数据采集 监控 BI
C#实验室检验LIS信息系统源码 微生物检验、质控维护
LIS系统的主要目标是为检验室开展检验工作提供更加有效的系统支持。该系统将尽量减少以人工操作的方式来实现信息转移,减少在接收检验项目、报告结果和保存记录等工作中可能会出现的人为误差,为检验结果查询提供更有效的方法,节省了管理信息所需的琐碎时间和精力。为实验室技术人员提供智能化的运行模式,使处理诸如按照规程审核检验结果、取消检验项目、分析、处理存在重大疑问的检验结果、执行特殊的命令和处理质量控制等问题更轻松自如,这将使检验人员更快地获得准确清晰的检验结果。为临床医护人员提供在线设施,使他们可以及时准确地获得相关实验室信息。确保检验结果的可靠性和准确性,利用实验室管理信息系统的仪器监控和质量控制,
60 0
|
5月前
|
存储 NoSQL 数据库
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
这篇文章讲述了在分布式微服务系统中添加用户注册和登录功能的过程,重点介绍了用户注册时通过远程服务调用第三方服务获取短信验证码、使用Redis进行验证码校验、对密码进行MD5加密后存储到数据库,以及用户登录时的远程服务调用和密码匹配校验的实现细节。
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
|
10天前
|
安全 算法 机器人
双重防护!红娘相亲app搭建开发,婚恋交友系统登录方式,密码+验证码的优势
在婚恋交友系统中,密码和验证码是两种重要的安全措施。密码用于验证用户身份,应设置为复杂组合以防止未经授权的访问;验证码则通过图形或字符识别,防止自动化攻击如暴力破解和注册机器人。两者同时开启可显著提高安全性,防止暴力破解和自动化注册,提升用户信任感。建议要求强密码、定期更新验证码样式,并在可疑登录时增加验证码复杂性。这样既能保障用户信息安全,又兼顾了用户体验。 ![交友11111.jpg](https://ucc.alicdn.com/pic/developer-ecology/hy2p6wcvgk4oe_c9eb8d6eb8144866b0cd1d96ffb0c907.jpg)