一、生成随机字符串

 方法一:

        public string CreateRandomCode(int codeCount)
{
string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,a,b,c,d,e,f,g,h,i,g,k,l,m,n,o,p,q,r,F,G,H,I,G,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,s,t,u,v,w,x,y,z";
string[] allCharArray = allChar.Split(',');
string randomCode = ""; //声明随机字符串变量
int temp = -;
Random rand = new Random(); //声明随机数对象
for (int i = ; i < codeCount; i++)
{
if (temp != -)
{
rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
}
int t = rand.Next();
if (temp == t)
{
return CreateRandomCode(codeCount);
}
temp = t;
randomCode += allCharArray[t];
}
return randomCode;
}

 方法二:

        private static string GetRandomString(int length)
{
return Guid.NewGuid().ToString("N").Substring(( - length), length);
}

二、创建验证码图片

 实现方法一:

public byte[] CreateValidateGraphic(string validateCode)
{
//声明用于处理由像素数据定义的图像的对象(宽,高)
Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 16.0), ); Graphics g = Graphics.FromImage(image);
try
{
Random random = new Random(); g.Clear(Color.White); //清空图片背景色 //画图片的干扰线
for (int i = ; i < ; i++)
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
g.DrawLine(new Pen(Color.Silver), x1, x2, y1, y2);
} Font font = new Font("Arial", , (FontStyle.Bold | FontStyle.Italic)); //设置字体样式和大小
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(, , image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
g.DrawString(validateCode, font, brush, , ); //绘制指定的字符串 //画图片的前景干扰线
for (int i = ; i < ; i++)
{
int x = random.Next(image.Width);
int y = random.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(random.Next()));
} g.DrawRectangle(new Pen(Color.Silver), , , image.Width - , image.Height - ); //画图片的边框线 //保存图片数据
MemoryStream stream = new MemoryStream();
image.Save(stream, ImageFormat.Jpeg); //输出图片流
return stream.ToArray();
}
finally
{
g.Dispose();
image.Dispose();
}
}

 实现方法二:

        /// <summary>
/// 由随机字符串,随即颜色背景,和随机线条产生的Image
/// </summary>
/// <returns>Image</returns>
public static byte[] GetVcodeImg(string text, int width = , int height = , int fontSize = )
//返回 Image
{
int charNum = text.Length;
//声明一个位图对象
Bitmap bitMap = null;
//声明一个绘图画面
Graphics gph = null;
//创建内存流
MemoryStream memStream = new MemoryStream();
Random random = new Random();
//由给定的需要生成字符串中字符个数 CharNum, 图片宽度 Width 和高度 Height 确定字号 FontSize,
//确保不因字号过大而不能全部显示在图片上
int fontWidth = (int)Math.Round(width / (charNum + ) / 1.3);
int fontHeight = (int)Math.Round(height / 1.5);
//字号取二者中小者,以确保所有字符能够显示,并且字符的下半部分也能显示
fontSize = fontWidth <= fontHeight ? fontWidth : fontHeight;
//创建位图对象
bitMap = new Bitmap(width + fontSize, height);
//根据上面创建的位图对象创建绘图图面
gph = Graphics.FromImage(bitMap);
//设定验证码图片背景色
gph.Clear(GetControllableColor());
//产生随机干扰线条
for (int i = ; i < ; i++)
{
Pen backPen = new Pen(GetControllableColor(), );
//线条起点
int x = random.Next(width);
int y = random.Next(height);
//线条终点
int x2 = random.Next(width);
int y2 = random.Next(height);
//划线
gph.DrawLine(backPen, x, y, x2, y2);
}
//定义一个含10种字体的数组
String[] fontFamily =
{
"Arial", "Verdana", "Comic Sans MS", "Impact", "Haettenschweiler",
"Lucida Sans Unicode", "Garamond", "Courier New", "Book Antiqua", "Arial Narrow"
}; SolidBrush sb = new SolidBrush(GetControllableColor());
//通过循环,绘制每个字符,
for (int i = ; i < text.Length; i++)
{
Font textFont = new Font(fontFamily[random.Next()], fontSize, FontStyle.Bold); //字体随机,字号大小30,加粗
//每次循环绘制一个字符,设置字体格式,画笔颜色,字符相对画布的X坐标,字符相对画布的Y坐标
int space = (int)Math.Round((double)((width - fontSize * (charNum + )) / charNum));
//纵坐标
int y = (int)Math.Round((double)((height - fontSize) / ));
gph.DrawString(text.Substring(i, ), textFont, sb, fontSize + i * (fontSize + space), y);
}
//扭曲图片
bitMap = TwistImage(bitMap, true, random.Next(, ), random.Next()); bitMap.Save(memStream, ImageFormat.Gif); bitMap.Dispose(); return memStream.ToArray();
} /// <summary>
/// 产生一种 R,G,B 均大于 colorBase 随机颜色,以确保颜色不会过深
/// </summary>
/// <returns>背景色</returns>
private static Color GetControllableColor(int colorBase)
{
Color color = Color.Black; Random random = new Random();
//确保 R,G,B 均大于 colorBase,这样才能保证背景色较浅
color = Color.FromArgb(random.Next() + colorBase, random.Next() + colorBase, random.Next() + colorBase);
return color;
} /// <summary>
/// 扭曲图片
/// </summary>
/// <param name="srcBmp"></param>
/// <param name="bXDir"></param>
/// <param name="dMultValue"></param>
/// <param name="dPhase"></param>
/// <returns></returns>
private static Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
{
int leftMargin = ;
int rightMargin = ;
int topMargin = ;
int bottomMargin = ; float PI2 = 6.28318530717959f;
Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);
double dBaseAxisLen = bXDir ? Convert.ToDouble(destBmp.Height) : Convert.ToDouble(destBmp.Width);
for (int i = ; i < destBmp.Width; i++)
{
for (int j = ; j < destBmp.Height; j++)
{
double dx = ;
dx = bXDir ? PI2 * Convert.ToDouble(j) / dBaseAxisLen : PI2 * Convert.ToDouble(i) / dBaseAxisLen;
dx += dPhase;
double dy = Math.Sin(dx);
//取得当前点的颜色
int nOldX = ;
int nOldY = ;
nOldX = bXDir ? i + Convert.ToInt32(dy * dMultValue) : i;
nOldY = bXDir ? j : j + Convert.ToInt32(dy * dMultValue);
var color = srcBmp.GetPixel(i, j);
if (nOldX >= leftMargin && nOldX < destBmp.Width - rightMargin && nOldY >= bottomMargin &&
nOldY < destBmp.Height - topMargin)
{
destBmp.SetPixel(nOldX, nOldY, color);
}
}
}
return destBmp;
}

三、将 8位字节数组 转换为 base64字符串 类型的数据

        private String BytesToBase64(Byte[] bytes)
{
try
{
return Convert.ToBase64String(bytes);
}
catch
{
return null;
}
}

四、接口与调用

  本例是在网站中通过 ashx 文件写的

调用以上三个方法:

        public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
StrHelper sh = new StrHelper(context);    //自己写的类,这里用来返回json数据 string code = CreateRandomCode();       //验证码的字符为4个
string image = BytesToBase64(CreateValidateGraphic(code));    //将图片验证码用base64类型的字符串返回(便于前端显示)
sh.RebackJson(new { status = , code = code, image = image, type = "image/Jpeg" });
}

在页面中调用:

<a >
<img id="img1" src="" onclick="changeImage()"/>
</a>
<script src="~/Scripts/jquery-1.10.2.js"></script>
<script>
window.onload = function () {
changeImage();
}
function changeImage() {
$.ajax({
url: "http://服务器地址:端口号/SecurityCode.ashx",
type: "post",
success: function (data) {
data = JSON.parse(data); console.log(data);
$("#img1").attr("src", 'data:image/png;base64,' + data.image);
},
error: function (data) { },
})
}
</script>

实现方式二 -- 存储到 Redis 缓存中

        /// <summary>
/// 生成验证码
/// </summary>
/// <returns></returns>
public static async Task<VCode_Return> GetCodeAsync()
{
//生成数字并保存,将和图片的base64返回
var text = GetRandomString(); string vid = ObjectId.GenerateNewId().ToString(); //存储缓存
await Redis.TopOauth.StringSetAsync($"VCODE:{vid}", text.ToLower(), new TimeSpan(, , )); var bytes = GetVcodeImg(text);
//生成图片
string imgbase64 = Convert.ToBase64String(bytes);
//返回验证码
VCode_Return myReturn = new VCode_Return { vcode_image = imgbase64, vcodeid = vid };
return myReturn;
}

1

生成图片验证码(.NET)的更多相关文章

  1. PHP生成图片验证码demo【OOP面向对象版本】

    下面是我今天下午用PHP写的一个生成图片验证码demo,仅供参考. 这个demo总共分为4个文件,具体代码如下: 1.code.html中的代码: <!doctype html> < ...

  2. python 全栈开发,Day85(Git补充,随机生成图片验证码)

    昨日内容回顾 第一部分:django相关 1.django请求生命周期 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这 ...

  3. net生成图片验证码--转自Lisliefor

    目前,机器识别验证码已经相当强大了,比较常见的避免被机器识别的方法,就是将验证码的字符串连到一起,这样就加大的识别的难度,毕竟机器没有人工智能.我找了很多的.net生成图片验证码的例子,后来经过一些修 ...

  4. python PIL图像处理-生成图片验证码

    生成效果如图: 代码 from PIL import Image,ImageDraw,ImageFont,ImageFilter import random # 打开一个jpg图像文件: im = I ...

  5. 在.net core web项目中生成图片验证码

    第1步:添加SkiaSharp包引用 Install-Package SkiaSharp 第2步:编写生成图片验证码的代码 using SkiaSharp; //在类文件头部添加引用 public I ...

  6. 【转载】Asp.Net生成图片验证码工具类

    在Asp.Net应用程序中,很多时候登陆页面以及其他安全重要操作的页面需要输入验证码,本文提供一个生成验证码图片的工具类,该工具类通过随机数生成验证码文本后,再通过C#中的图片处理类位图类,字体类,一 ...

  7. js依赖mui.css生成图片验证码

    js依赖mui.css生成图片验证码 相关css和js引入路径 https://cdnjs.cloudflare.com/ajax/libs/mui/3.7.1/css/mui.css https:/ ...

  8. (七)利用servlet生成图片验证码

    总结: 验证码就是一张图,然后往这张图上写入随机的字符(数字字母等). 1.1 编写html页面 <!DOCTYPE html> <html> <head> < ...

  9. PIL实现图片框架以及生成图片验证码

    1. PIL的基本概念 PIL:即Python Imaging Library,是Python平台事实上的图像处理标准库. PIL中涉及通道(bands)和模式(mode)这两个重要概念. (1)通道 ...

  10. Django登录(含随机生成图片验证码)注册实例

    登录,生成随机图片验证码 一.登录 - 随机生成图片验证码 1.随机生成验证码 Python随机生成图片验证码,需要使用PIL模块,安装方式如下: pip3 install pillow 1)创建图片 ...

随机推荐

  1. http协议/获得请求/中文参数处理/访问数据库

    # 1. http协议(了解)## (1)什么是http协议?一种网络应用层协议,规定了浏览器与web服务器之间如何通信以及相应的的数据包的结构.注:tcp/ip协议:保证数据可靠的传递.(UDP不可 ...

  2. MySQL Crash Course #04# Chapter 7. 8 AND. OR. IN. NOT. LIKE

    索引 AND. OR 运算顺序 IN Operator VS. OR NOT 在 MySQL 中的表现 LIKE 之注意事项 运用通配符的技巧 Understanding Order of Evalu ...

  3. Python入门之Python Colorama模块

    Python的Colorama模块,可以跨多终端,显示字体不同的颜色和背景,只需要导入colorama模块即可,不用再每次都像linux一样指定颜色: 官方参考:https://pypi.org/pr ...

  4. P3456 [POI2007]GRZ-Ridges and Valleys(bfs)

    P3456 [POI2007]GRZ-Ridges and Valleys 八个方向都跑一遍bfs,顺便判断一下是山峰还是山谷,或者是山坡(俩都不是) (实在不知道要说啥了qwq) #include& ...

  5. 20145321 《网络对抗技术》 MSF基础应用

    20145321 <网络对抗技术> MSF基础应用 实验内容 掌握metasploit的基本应用方式以及常用的三种攻击方式的思路 主动攻击,即对系统的攻击,不需要被攻击方配合,这里以ms0 ...

  6. 2018-2019-1 1723《程序设计与数据结构》第5&6&7周作业 总结

    作业地址 第五周作业: 提交情况如图: 第六周作业: 提交情况如图: 第七周作业: 提交情况如图: 作业问题 很多看上写的比较详细并且语言组织的也不错,我就这么随手一百度,搜出来了很多篇博客.(无奈) ...

  7. ArrayList初始化的4种方法

    In the last post we discussed about class ArrayList in Javaand it’s important methods. Here we are s ...

  8. linux如何删除行首的空格

    答: sed 's/^ *//' jello.txt > hello.txt

  9. ubuntu下转换flv格式为mp4格式

    一.环境 ubuntu 16.04 二.安装工具 sudo apt install libav-tools 三.开始转换 avconv -i input.flv -codec copy output. ...

  10. fread

    快速读入? 不知道 反正只是贴过来的 以后或许会用到? #define FI(n) FastIO::read(n) namespace FastIO { << ; ]; int bi = ...