效果:

调用方法:

int[] r = QAPI.VerifImage.RandomList();//取得随机数种子列
string vcode = QAPI.VerifImage.CreateVCode(r, );//产生验证码字符
pictureBox1.Image = QAPI.VerifImage.CreateVerifImage(vcode, r, true, true, TextRenderingHint.AntiAlias);//生成
//-----ASP.NET中上面最后一句改成:
img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png);
Response.ContentType = "image/png";

源码:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Text;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks; namespace QAPI
{
class VerifImage
{
[DllImport("kernel32.dll")]
private static extern void CopyMemory(int[] Destination, byte[] add, int Length);
static Color[] Backcolor = { Color.SeaShell, Color.LightCyan, Color.MistyRose, Color.AliceBlue, Color.Wheat, Color.PowderBlue };
static int[] thCor = { , , , , , , , , , , , };
/// <summary>
/// 生成验证码
/// </summary>
/// <param name="vcode">验证码字符,仅限4个长度的英文和数字</param>
/// <param name="lstR">随机种子数组</param>
/// <param name="Aliasing">抗锯齿开关</param>
/// <param name="Backline">背景线条开关</param>
/// <param name="rth">字符打印质量模式</param>
/// <returns>返回Bitmap对象</returns>
public static Bitmap CreateVerifImage(string vcode, int[] lstR,
bool Aliasing = false,
bool Backline = true,
TextRenderingHint rth = TextRenderingHint.SystemDefault)
{
Bitmap map = new Bitmap(, );//创建图片背景
using (Graphics g = Graphics.FromImage(map))
{
g.Clear(Backcolor[lstR[] % ]);
if (Aliasing && Backline)//抗锯齿,用于背景线条
{
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;
}
int cr = ; int cg = ; int cb = ;
if (Backline)//背景线条
for (int i = ; i < ; i++)//绘制背景线条,横竖各3条
{
cr = new Random(lstR[] + i * ).Next(, );
cg = new Random(lstR[] + i * ).Next(, );
cb = new Random(lstR[] + i * ).Next(, );
Pen pb = new Pen(Color.FromArgb(cr, cg, cb), i % + );
Point p1 = new Point(new Random(lstR[] + i * ).Next(, ), );
Point p2 = new Point(new Random(lstR[] + i * ).Next(, ), );
g.DrawLine(pb, p1, p2);
cr = new Random(lstR[] + i * ).Next(, );
cg = new Random(lstR[] + i * ).Next(, );
cb = new Random(lstR[] + i * ).Next(, );
pb = new Pen(Color.FromArgb(cr, cg, cb), i % + );
p1 = new Point(, new Random(lstR[] + i * ).Next(, ));
p2 = new Point(, new Random(lstR[] + i * ).Next(, ));
g.DrawLine(pb, p1, p2);
}
g.TextRenderingHint = rth;
Font f;
int left = ; int top = ;
for (int i = ; i < vcode.Length; i++)
{
int asc = (int)vcode[i];
int min = asc > ? : ;//大写英文和数字同字号大小有差异
int max = asc > ? : ;
int sz = new Random(lstR[i]).Next(min, max);
f = new Font("Arial", sz);
asc = (lstR[i] % ) * ;//字体颜色
cr = new Random(lstR[i]).Next(thCor[asc], thCor[asc + ]);
cb = new Random(lstR[i + ]).Next(thCor[asc + ], thCor[asc + ]);
cg = new Random(lstR[i + ]).Next(, );
Color cor = Color.FromArgb(cr, cg, cb);
if (i < )
left = (i * ) - + (sz % );
else
left = i * - (sz % );
top = - + (sz % );
g.DrawString(vcode[i].ToString(), f, new SolidBrush(cor), left, top);
}
}
return map;
}
/// <summary>
/// 生成随机英文数字的随机字符
/// </summary>
/// <param name="lstR">随机种子数组</param>
/// <param name="mode">生成模式</param>
/// <returns>长度4的字符串</returns>
public static string CreateVCode(int[] lstR, int mode = )
{
//去掉容易错判的字母 i,l,o,z
char[] c = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
'', '', '', '', '', '', '', '', '', ''};
int p = ;
int length = ;
switch (mode)
{
case : p = ; length = ; break; //只是数字
case : p = ; length = ; break; //只是小写字母
case : p = ; length = ; break; //只是大写字母
case : p = ; length = ; break; //大小写混合
case : p = ; length = ; break; //大写字母+数字(不含1和0)
default: p = ; length = c.Length; break; //所有混合
}
string s = c[lstR[] % length + p].ToString() +
c[lstR[] % length + p].ToString() +
c[lstR[] % length + p].ToString() +
c[lstR[] % length + p].ToString();
return s;
}
public static int[] RandomList()
{
string guid = System.Guid.NewGuid().ToString("N");//f61fb920bb56454a86dfb91162717d87
byte[] byt = System.Text.Encoding.ASCII.GetBytes(guid);
int[] r = new int[];
CopyMemory(r, byt, );
return r;
}
//CreateVerifImage()最后一个参数的可能值
//System.Drawing.Text.TextRenderingHint.TextRenderingHint.SingleBitPerPixel;
//System.Drawing.Text.TextRenderingHint.TextRenderingHint.AntiAlias;
//System.Drawing.Text.TextRenderingHint.TextRenderingHint.SystemDefault;
//System.Drawing.Text.TextRenderingHint.TextRenderingHint.ClearTypeGridFit;
//System.Drawing.Text.TextRenderingHint.TextRenderingHint.SingleBitPerPixelGridFit;
}
}

ASP.NET图形验证码的生成的更多相关文章

  1. [ASP.NET] 图形验证码破解-以简单图形为例

    原文 http://www.dotblogs.com.tw/joysdw12/archive/2013/06/08/captcha-cracked.aspx 前言 这次来讲个比较有趣的主题,就是该如何 ...

  2. gin框架中图形验证码的生成和验证

    功能和验证码使用原理 本案例中没有使用redis作为缓存,而是使用的内存存储方法 github链接地址 下载命令 go get github.com/mojocn/base64Captcha 请求处理 ...

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

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

  4. Java 之图形验证码

    图形验证码作用 防止恶意注册 防暴力破解 Java 与图片相关的类: Image, ImageIO, BufferedImage, Icon, ImageIcon public static void ...

  5. 笔记——Springboot response、ServletOutputStream、图形验证码显示慢

    今天遇到一个图形验证码加载很慢的问题,大概耗时有200~500毫秒左右. 根据追踪,图形验证码图片生成耗时0~1毫秒,而response.getOutputStream.write()将图片写入前台页 ...

  6. java图形验证码实现

    前言 本文首发于公众号[我的小碗汤]本公众号免费提供csdn下载服务,海量IT学习资源,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java.go.python.spr ...

  7. 一百一十五:CMS系统之实现点击更换图形验证码功能

    把验证码渲染到到页面上 访问,显然,是标签有个内边距 去掉内边距 加一个class 如果放大看的话,还有问题 用js实现点击更换图形验证码:生成查询字符串的形式访问图形验证码接口的url,放到img标 ...

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

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

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

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

随机推荐

  1. c#在字符串中计算加减乘除...

                DataTable dt = new DataTable();             Response.Write(dt.Compute("1+1*5", ...

  2. json和jsonp

    JSON是一种数据交换格式!   JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议!   一般使用JSON来传数据,靠JSONP来跨域.   JSON的优点: 1.基于纯文本, ...

  3. 在_vimrc中 set noexpandtab python 不起效果

    我ctm,今天配置不让tab转为空格,在_vimrc中set noexpandtab 不起效果. set ts=4也不起效果. 但是在命令行中其效果. 我都不知道咋办了. 问人说我有可能使用的不是那个 ...

  4. Owin Self Host

    http://owin.org/ Owin 定义了webserver和webapplication之间的标准接口,目标就是为了解耦webapplication对webserver的依赖, 就是说以后可 ...

  5. Demo中的IOC自定义实现

    在做练习的时候,小小项目,使用IOC控件觉得麻烦,使用工厂觉得不高大上啊,自己写个简陋的依赖注入IOC吧; 控制反转(IOC)是管理映射依赖的的,是依赖倒置(DIP)的实现方式; 依赖倒置(DIP)是 ...

  6. 出售Illustrator脚本插件面板(包含面板源码,以及面板上所有的功能源码)

    出售Illustrator脚本插件面板(包含面板源码,以及面板上所有的功能源码) 购买后可提供相应的小修改,以及教你使用往这个多列面里再加上按钮功能! 这套源码可作为工作使用,也可用为新手学习AI脚面 ...

  7. SB Admin 2 学习笔记1

    需要掌握能够搭建起一个 dashboard 的能力, 因为很少有运维开发团队有专职的前端, bootstrap 也要讲个基本法. SB Admin 2, 一个免费的 bootstrap theme, ...

  8. git整理

    git图形客户端:SourceTree bash: 先初始化: git init 添加远程仓库: git remote add sae https://git.sinacloud.com/newapp

  9. C# 操作excel单元格居中

    C# 操作excel //导出Excel        private void ExportExcel(string fileName, System.Data.DataTable myDGV, s ...

  10. 51nod1459(带权值的dijkstra)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 题意:中文题诶- 思路:带权值的最短路,这道题数据也没 ...