ASP.NET图形验证码的生成

效果:

调用方法:

int[] r = QAPI.VerifImage.RandomList();//取得随机数种子列
string vcode = QAPI.VerifImage.CreateVCode(r, 4);//产生验证码字符
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 = { 127, 255, 0, 127, 127, 255, 127, 255, 0, 127, 127, 255 };
        /// <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(100, 40);//创建图片背景
            using (Graphics g = Graphics.FromImage(map))
            {
                g.Clear(Backcolor[lstR[0] % 6]);
                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 = 0; int cg = 0; int cb = 0;
                if (Backline)//背景线条
                    for (int i = 0; i < 3; i++)//绘制背景线条,横竖各3条
                    {
                        cr = new Random(lstR[0] + i * 3).Next(150, 255);
                        cg = new Random(lstR[1] + i * 5).Next(150, 255);
                        cb = new Random(lstR[2] + i * 7).Next(150, 255);
                        Pen pb = new Pen(Color.FromArgb(cr, cg, cb), i % 2 + 1);
                        Point p1 = new Point(new Random(lstR[3] + i * 11).Next(0, 100), 0);
                        Point p2 = new Point(new Random(lstR[4] + i * 13).Next(0, 100), 40);
                        g.DrawLine(pb, p1, p2);
                        cr = new Random(lstR[0] + i * 13).Next(150, 255);
                        cg = new Random(lstR[1] + i * 11).Next(150, 255);
                        cb = new Random(lstR[2] + i * 7).Next(150, 255);
                        pb = new Pen(Color.FromArgb(cr, cg, cb), i % 2 + 1);
                        p1 = new Point(0, new Random(lstR[3] + i * 5).Next(0, 40));
                        p2 = new Point(100, new Random(lstR[4] + i * 3).Next(0, 40));
                        g.DrawLine(pb, p1, p2);
                    }
                g.TextRenderingHint = rth;
                Font f;
                int left = 0; int top = 0;
                for (int i = 0; i < vcode.Length; i++)
                {
                    int asc = (int)vcode[i];
                    int min = asc > 57 ? 16 : 24;//大写英文和数字同字号大小有差异
                    int max = asc > 57 ? 28 : 32;
                    int sz = new Random(lstR[i]).Next(min, max);
                    f = new Font("Arial", sz);
                    asc = (lstR[i] % 3) * 4;//字体颜色
                    cr = new Random(lstR[i]).Next(thCor[asc], thCor[asc + 1]);
                    cb = new Random(lstR[i + 1]).Next(thCor[asc + 2], thCor[asc + 3]);
                    cg = new Random(lstR[i + 2]).Next(0, 155);
                    Color cor = Color.FromArgb(cr, cg, cb);
                    if (i < 2)
                        left = (i * 25) - 5 + (sz % 6);
                    else
                        left = i * 24 - (sz % 6);
                    top = -4 + (sz % 12);
                    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 = 0)
        {
            //去掉容易错判的字母 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‘,
                         ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘1‘, ‘0‘};
            int p = 0;
            int length = 0;
            switch (mode)
            {
                case 0: p = 44; length = 10; break;         //只是数字
                case 1: p = 0; length = 22; break;          //只是小写字母
                case 2: p = 22; length = 22; break;         //只是大写字母
                case 3: p = 0; length = 44; break;          //大小写混合
                case 4: p = 22; length = 30; break;         //大写字母+数字(不含1和0)
                default: p = 0; length = c.Length; break;   //所有混合
            }
            string s = c[lstR[0] % length + p].ToString() +
                       c[lstR[1] % length + p].ToString() +
                       c[lstR[2] % length + p].ToString() +
                       c[lstR[3] % 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[8];
            CopyMemory(r, byt, 32);
            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;
    }
}
时间: 2024-11-02 09:44:31

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

图形验证码的生成(数字和英文大小写)和提交验证

最初接触时,感觉很好玩,然后就自己研究了下,做了个demo,然后整理下,下次可以直接使用啦,英文大小写,点击可以切换 上代码了.... 页面代码: <img id="Img" src="/Login/GetCheckCode" /> 这个是页面JQuery点击更换方法 $("#Img").click(function () { //this.src = "/Login/GetCheckCode?time="+(ne

java图形验证码实现

前言 本文首发于公众号[我的小碗汤]本公众号免费提供csdn下载服务,海量IT学习资源,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java.go.python.springcloud.elk.嵌入式 .大数据.面试资料.前端 等资源.扫码关注: 正文 今天来学习下图形验证码的生成,首先依赖开源组件: <dependency> <groupId>com.github.penggle</groupId> <artifactId>

生成图形验证码

介绍生成两种类型的图形验证码: 1.普通的随机字符串;  2.随机运算表达式 图形验证码类: /// <summary> /// 图形验证码类 /// </summary> public class PicCaptcha { #region Constructed Methods /// <summary> /// 默认构造方法 /// </summary> public PicCaptcha() { } /// <summary> ///构造方

python 生成图形验证码

文章链接:https://mp.weixin.qq.com/s/LYUBRNallHcjnhJb1R3ZBg 日常在网站使用过程中经常遇到图形验证,今天准备自己做个图形验证码,这算是个简单的功能,也适合新手练习的,便于自己学习. 主要用到的库--PIL图像处理库,简单的思路,我们需要随机的颜色,随机的数字或字母,随机的线条.点作为干扰元素 拼凑成一张图片. 生成随机颜色,返回的是rgb三色. def getRandomColor(): r = random.randint(0, 255) g =

图形验证码生成方法

图形验证码生成方法@RequestMapping("/verification")public void valicode(HttpServletResponse response, HttpSession session) throws Exception { //利用图片工具生成图片 //第一个参数是生成的验证码,第二个参数是生成的图片 Object[] objs = VerifyUtil.createImage(); String codeKey = "IMAGECOD

ASP.NET中登陆验证码的生成和输入验证码的验证

一:验证码的生成实现代码 protected void Page_Load(object sender, EventArgs e)    {        string validateCode = CreateValidateCode();//生成验证码         Bitmap bitmap = new Bitmap(imgWidth, imgHeight);//生成Bitmap图像         DisturbBitmap(bitmap); //图像背景         DrewVa

ASP.NET mvc 验证码 (转)

ASP.net 验证码(C#) MVC http://blog.163.com/xu_shuhao/blog/static/5257748720101022697309/ 网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录.灌水等危害网站的操作.验证码被广泛应用在注册.登录.留言等提交信息到服务器端处理的页面中.     在ASP.NET网站中应用验证码是很容易的,网上有很多的解决方案.最近在做一个OA项目,因系统采用的ASP.NET MVC

图形验证码如何解决集群中使用问题

刚才写了一篇文章关于图形验证码的,感觉没有考虑集群情况.其实集群无非加一个集群缓存 将session换成redis或者memcatch. 今天记录一下 使用 redis做集群图形验证码的相关方案. 基于文章: http://www.cnblogs.com/owenma/p/7375540.html 添加redis: 在获取和存储的地方使用的是redis封装好的cacheManager. @RequestMapping(value = "/getKaptchaImage", method

图形验证码实现方案(解决短信轰炸问题)

最近收到leader的一个邮件说我们的项目有短信轰炸风险.顿时让一个做技术开发的人为之一颤.今天给大家介绍一个解决这个问题的使用工具. 就是谷歌的 kaptcha 进行验证码生成和校验.闲话少说直接上代码. 1. 首先下载一个工具包 <dependency> <groupId>com.github.axet</groupId> <artifactId>kaptcha</artifactId> <version>0.0.9</ve