C#生成图形验证码
先看效果:

再上代码
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#生成图形验证码的更多相关文章
- PHP5 GD库生成图形验证码(汉字)
PHP5 GD库生成图形验证码且带有汉字的实例分享. 1,利用GD库函数生成图片,并在图片上写指定字符imagecreatetruecolor 新建一个真彩色图像imagecolorallocate ...
- PHP5生成图形验证码(有汉字)
利用PHP5中GD库生成图形验证码 类似于下面这样 1.利用GD库函数生成图片,并在图片上写指定字符 imagecreatetruecolor 新建一个真彩色图像 imagecolora ...
- java生成图形验证码
效果图 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buf ...
- ASP.NET中如何生成图形验证码
通常生成一个图形验证码主要 有3个步骤: (1)随机产生一个长度为N的随机字符串,N的值可由开发可由开发人员自行设置.该字符串可以包含数字.字母等. (2)将随机生成的字符串创建成图片,并显示. (3 ...
- Net Core 生成图形验证码
1. NetCore ZKweb 在我第一次绘制图形验证码时是采用的ZKweb的绘制库,奉上代码参考 public byte[] GetVerifyCode(out string ...
- python 生成图形验证码
文章链接:https://mp.weixin.qq.com/s/LYUBRNallHcjnhJb1R3ZBg 日常在网站使用过程中经常遇到图形验证,今天准备自己做个图形验证码,这算是个简单的功能,也适 ...
- (转)Android 之生成图形验证码
import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; impor ...
- 【Java】生成图形验证码
本章介绍一个能生成比较好看的图形验证码类 生成验证码工具类 package com.util; import java.awt.Color; import java.awt.Font; import ...
- Asp.Net Core 生成图形验证码
前几天有朋友问我怎么生成图片验证码,话不多说直接上代码. 支持.NET CORE开源.助力.NET Core社区发展. using System; using System.IO; using Sys ...
随机推荐
- javascript 最常用的技巧整理
1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu= ...
- jquery的show/hide性能测试
这篇文章是jQuery各种 show/hide方式的性能测试.作者之所以测试这个源于Robert Duffy在SanFrancisco举行的jQuery大会上的一句话:“.hide()和.show() ...
- CSS 加载新方式
Chrome 浏览器有意改变<link rel="stylesheet">的加载方式,当其出现在<body>中时,这一变化将更加明显.笔者决定在本文中进行详 ...
- To Use Ubuntuubunt
1.rename PC; modify the /etc/hostname. 2.Use root account; 1.set the password for root account: sudo ...
- spring 主题使用详解[转]
在common_include_v2.jsp文件中,spring主题的使用: <link href="${staticPath }/<spring:theme code='sty ...
- hdu 4462(状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4462 思路:由于数据不大,可以直接将所有的状态表示出来,然后枚举,判断能否将方格全部覆盖. http: ...
- 多线程系列 线程池ThreadPool
上一篇文章我们总结了多线程最基础的知识点Thread,我们知道了如何开启一个新的异步线程去做一些事情.可是当我们要开启很多线程的时候,如果仍然使用Thread我们需要去管理每一个线程的启动,挂起和终止 ...
- 华为OJ:字符串合并处理
字符串合并处理 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在 ...
- 控制台console输出信息原理理解
Eclipse控制台输出信息的控制 标签: Eclipse控制台输出信息 2015-01-02 14:11 22454人阅读 评论(1) 收藏 举报 分类: Some Tips(15) 版权声明: ...
- Linux软链接和硬链接
Linux中的链接有两种方式,软链接和硬链接.本文试图清晰彻底的解释Linux中软链接和硬链接文件的区别. 1.Linux链接文件 1)软链接文件 软链接又叫符号链接,这个文件包含了另一个文件的路径 ...