先看效果:

再上代码

public class CaptchaHelper
{
private static Random rand = new Random();
private static int previousAngle = 0; /// <summary>
/// 生成图形验证码
/// </summary>
/// <returns></returns>
public static byte[] Create(int codeLength, int width, int height, int fontSize, out String code)
{
String sCode = String.Empty;
//可用颜色列表
Color[] oColors = {
Color.FromArgb(118, 199, 192),
Color.FromArgb(97, 216, 206),
Color.FromArgb(84, 176, 168),
Color.FromArgb(117, 226, 217),
Color.FromArgb(43, 205, 191)
//Color.Red,
//Color.Blue,
//Color.Green,
//Color.Orange,
//Color.Brown,
//Color.Brown,
//Color.DarkBlue
};
//可用字体列表
string[] oFontNames = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" };
//可用字符列表
char[] oCharacter = {
'2','3','4','5','6','8','9',
'A','B','C','D','E','F','G','H','J','K','L','M','N','P','R','S','T','W','X','Y'
};
//Random oRnd = new Random();
Bitmap oBmp = null;
Graphics oGraphics = null;
int N1 = 0;
Point oPoint1 = default(Point);
Point oPoint2 = default(Point);
string sFontName = null;
Font oFont = null;
Color oColor = default(Color); //生成验证码字符串
for (N1 = 0; N1 <= codeLength - 1; N1++)
{
sCode += oCharacter[rand.Next(oCharacter.Length)];
} oBmp = new Bitmap(width, height);
oGraphics = Graphics.FromImage(oBmp);
oGraphics.Clear(Color.White);
try
{
for (N1 = 0; N1 <= 2; N1++)
{
//画噪线
oPoint1.X = rand.Next(width);
oPoint1.Y = rand.Next(height);
oPoint2.X = rand.Next(width);
oPoint2.Y = rand.Next(height);
oColor = oColors[rand.Next(oColors.Length)];
oGraphics.DrawLine(new Pen(oColor), oPoint1, oPoint2);
} float spaceWith = 0, dotX = 0;
if (codeLength != 0)
{
spaceWith = (width - fontSize * codeLength - 10) / codeLength;
} for (N1 = 0; N1 <= sCode.Length - 1; N1++)
{
//画验证字符串
sFontName = oFontNames[rand.Next(oFontNames.Length)];
oFont = new Font(sFontName, fontSize, FontStyle.Bold);
oColor = oColors[rand.Next(oColors.Length)]; dotX = Convert.ToSingle(N1) * fontSize + (N1 + 1) * spaceWith;
DrawCharacter(sCode[N1].ToString(), oGraphics, oFont, new SolidBrush(oColor), (int)dotX, fontSize, height);
} for (int i = 0; i <= 30; i++)
{
//画噪点
int x = rand.Next(oBmp.Width);
int y = rand.Next(oBmp.Height);
Color clr = oColors[rand.Next(oColors.Length)];
oBmp.SetPixel(x, y, clr);
} code = sCode;
//保存图片数据
MemoryStream stream = new MemoryStream();
oBmp.Save(stream, ImageFormat.Jpeg);
//输出图片流
return stream.ToArray();
}
finally
{
oGraphics.Dispose();
}
} private static void DrawCharacter(string txt, Graphics gr, Font font, Brush brush, int x, int charWidth, int height)
{
// 文字居中
using (StringFormat stringFormat = new StringFormat())
{
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
RectangleF rectf = new RectangleF(x, 0, charWidth, height); // 转换为 Path
using (GraphicsPath graphicsPath = new GraphicsPath())
{
graphicsPath.AddString(txt, font.FontFamily, (int)(font.Style), font.Size, rectf, stringFormat); // 旋转一个随机角度
float dx = (float)(x + charWidth / 2);
float dy = (float)(height / 2);
gr.TranslateTransform(-dx, -dy, MatrixOrder.Append);
int angle = previousAngle;
do
{
angle = rand.Next(-30, 30);
} while (Math.Abs(angle - previousAngle) < 20);
previousAngle = angle;
gr.RotateTransform(angle, MatrixOrder.Append);
gr.TranslateTransform(dx, dy, MatrixOrder.Append); // 画文字
gr.FillPath(brush, graphicsPath);
gr.ResetTransform();
}
}
}
}

  

C#生成图形验证码的更多相关文章

  1. PHP5 GD库生成图形验证码(汉字)

    PHP5 GD库生成图形验证码且带有汉字的实例分享. 1,利用GD库函数生成图片,并在图片上写指定字符imagecreatetruecolor 新建一个真彩色图像imagecolorallocate ...

  2. PHP5生成图形验证码(有汉字)

    利用PHP5中GD库生成图形验证码 类似于下面这样 1.利用GD库函数生成图片,并在图片上写指定字符 imagecreatetruecolor   新建一个真彩色图像      imagecolora ...

  3. java生成图形验证码

    效果图 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buf ...

  4. ASP.NET中如何生成图形验证码

    通常生成一个图形验证码主要 有3个步骤: (1)随机产生一个长度为N的随机字符串,N的值可由开发可由开发人员自行设置.该字符串可以包含数字.字母等. (2)将随机生成的字符串创建成图片,并显示. (3 ...

  5. Net Core 生成图形验证码

    1. NetCore ZKweb       在我第一次绘制图形验证码时是采用的ZKweb的绘制库,奉上代码参考      public byte[] GetVerifyCode(out string ...

  6. python 生成图形验证码

    文章链接:https://mp.weixin.qq.com/s/LYUBRNallHcjnhJb1R3ZBg 日常在网站使用过程中经常遇到图形验证,今天准备自己做个图形验证码,这算是个简单的功能,也适 ...

  7. (转)Android 之生成图形验证码

    import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; impor ...

  8. 【Java】生成图形验证码

    本章介绍一个能生成比较好看的图形验证码类 生成验证码工具类 package com.util; import java.awt.Color; import java.awt.Font; import ...

  9. Asp.Net Core 生成图形验证码

    前几天有朋友问我怎么生成图片验证码,话不多说直接上代码. 支持.NET CORE开源.助力.NET Core社区发展. using System; using System.IO; using Sys ...

随机推荐

  1. vi/vim使用指北 ---- Beyond the Basic

    更多的组合命令 [number]-[command]-[test object] number:   数字 comand:  c,d,y  (修改,删除,复制) test object: 移动光标的命 ...

  2. 2014ACM-ICPC 西安赛区总结

    万万没想到,打铁了.以前一直觉得拿铁咖啡的梗是很好笑的,然后有一天这杯咖啡自己喝下去了,就会发现心里真的被梗住了. 复旦的题其实我是有预料到的,前年的复旦题三题从金区到铜区都有,但是从去年的南京赛区开 ...

  3. iOS第三方支付-微信支付

    微信支付用到的文件 1.首先支持非arc 2.设置URL types 3.AppDelegate - (BOOL)application:(UIApplication *)application di ...

  4. ASP 中调用函数关于Call使用注意的问题

    Function TestFun(Tstr) TStr = "Fun2" End Function Sub TestSub(TStr) Tstr = "Sub2" ...

  5. Dom新find

    1.HTML标签和属性是不区分大小写的,但JS是区分大小写的:所以(1)HTML专有的接口的属性应该以小写字母开头,如果属性名由多个单词构成,第二个及接下来的每个单词的首字母都要大写.(2)有些HTM ...

  6. Linux基础--文件压缩

    1.compress [root@linux ~]# compress [-dcr] 档案或目录 参数: -d:用来解压缩的参数 -r:可以连同目录下的档案也同时给予压缩呢! -c:将压缩数据输出成为 ...

  7. iOS开发-网易滚动导航栏

    HACursor,是一个对横向ScrollView中的视图进行管理的UI控件.只要几行代码就可以集成类似于网易新闻对主题页面进行排序,删除操作的功能.主srollview参考iOS原生的UITable ...

  8. XP下,文件夹添加右键命令行

    原文:XP下,文件夹添加右键命令行 总共有3种方式: --------------------1---------------------------------------------------- ...

  9. Rate Limiter设计

    先存着,以后再写 http://iamzhongyong.iteye.com/blog/1982113 http://baike.baidu.com/view/2530454.htm https:// ...

  10. 解决Ext.form.DateField在浏览器中显示可能有问题

    解决Ext.form.DateField在浏览器中显示可能有问题,界面将会拉的很长很长.如下图:  办法: 1:设置css的长度 .x-date-menu { padding-top:2px;padd ...