当前位置: 首页 > 编程日记 > 正文

随机生成6位图片验证码


1. [代码][C#]代码 
/// <summary>
    /// PicHandler1 的摘要说明
    /// </summary>
    public class PicHandler1 : IHttpHandler, IRequiresSessionState
    {
        private string mCheckNo = string.Empty;
        protected ImgBuilder _ImgBuilder = new ImgBuilder();
        protected VryImgGen _ImgBuilderNew = new VryImgGen();
        private string _text = string.Empty;
        private string _font = "宋体";
        private int _fontSize = 8;
        private int _padding = 2;
        public void ProcessRequest(HttpContext context)
        {
            mCheckNo = DisCheckNo();
            context.Session["CheckCode"] = mCheckNo;
            this._ImgBuilder.FontSize = this._fontSize;
            this._ImgBuilder.Padding = this._padding;

if (!string.IsNullOrEmpty(this._font))
            {
                this._ImgBuilder.Fonts = new string[] { this._font };
            }
            this._ImgBuilderNew.ChaosWight = 40;
            this._ImgBuilderNew.FontSize = 25;

this._ImgBuilderNew.Padding = 3;
            System.Drawing.Bitmap image =
             this._ImgBuilderNew.CreateImage(mCheckNo);
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            context.Response.ClearContent();
            context.Response.ContentType = "image/Jpeg";
            context.Response.BinaryWrite(ms.ToArray());
            context.Session["CheckCode"] = mCheckNo.ToString(); //如果没有实现IRequiresSessionState,则这里会出错,也无法生成图片
            context.Response.End();
        }

//验证码生成
        protected string DisCheckNo()
        {
            string hash = HashCode.GetNext();
            string CheckNo = string.Empty;
            Random rd = new Random(DateTime.Now.Millisecond);
            for (int i = 0; i < 6; i++)
            {
                CheckNo += hash.Substring(rd.Next(1, hash.Length - 1), 1);
            }
            CheckNo = CheckNo.Replace("0", rd.Next(1, 9).ToString());
            CheckNo = CheckNo.Replace("o", rd.Next(1, 9).ToString());
            CheckNo = CheckNo.Replace("O", rd.Next(1, 9).ToString());
            return CheckNo;
        }

public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
2. [代码]调用的类   
using System;
using System.Drawing;
using System.Text;

/// <summary>
/// VryImgGen 的摘要说明
/// </summary>
public class VryImgGen
{
    public static string ChineseChars = String.Empty;

/// <summary>
    /// 英文与数字串
    /// </summary>
    protected static readonly string EnglishOrNumChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

public VryImgGen()
    {
        rnd = new Random(unchecked((int)DateTime.Now.Ticks));
    }

/// <summary>
    /// 全局随机数生成器
    /// </summary>
    private Random rnd;

int length = 5;
    /// <summary>
    /// 验证码长度(默认6个验证码的长度)
    /// </summary>
    public int Length
    {
        get { return length; }
        set { length = value; }
    }

int fontSize = 20;
    /// <summary>
    /// 验证码字体大小(为了显示扭曲效果,默认30像素,可以自行修改)
    /// </summary>
    public int FontSize
    {
        get { return fontSize; }
        set { fontSize = value; }
    }

int padding = 4;
    /// <summary>
    /// 边框补(默认4像素)
    /// </summary>
    public int Padding
    {
        get { return padding; }
        set { padding = value; }
    }

bool chaos = true;
    /// <summary>
    /// 是否输出燥点(默认输出)
    /// </summary>
    public bool Chaos
    {
        get { return chaos; }
        set { chaos = value; }
    }

Color chaosColor = Color.LightGray;
    /// <summary>
    /// 输出燥点的颜色(默认灰色)
    /// </summary>
    public Color ChaosColor
    {
        get { return chaosColor; }
        set { chaosColor = value; }
    }

int chaosWight = 1;
    /// <summary>
    /// 输出燥点的浓度
    /// </summary>
    public int ChaosWight
    {
        get { return chaosWight; }
        set { chaosWight = value; }
    }

Color backgroundColor = Color.White;
    /// <summary>
    /// 自定义背景色(默认白色)
    /// </summary>
    public Color BackgroundColor
    {
        get { return backgroundColor; }
        set { backgroundColor = value; }
    }

Color[] colors = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
    /// <summary>
    /// 自定义随机颜色数组
    /// </summary>
    public Color[] Colors
    {
        get { return colors; }
        set { colors = value; }
    }

string[] fonts = { "Arial", "Georgia" };
    /// <summary>
    /// 自定义字体数组
    /// </summary>
    public string[] Fonts
    {
        get { return fonts; }
        set { fonts = value; }
    }

#region 产生波形滤镜效果

private const double PI = 3.1415926535897932384626433832795;
    private const double PI2 = 6.283185307179586476925286766559;

/// <summary>
    /// 正弦曲线Wave扭曲图片(Edit By 51aspx.com)
    /// </summary>
    /// <param name="srcBmp">图片路径</param>
    /// <param name="bXDir">如果扭曲则选择为True</param>
    /// <param name="nMultValue">波形的幅度倍数,越大扭曲的程度越高,一般为3</param>
    /// <param name="dPhase">波形的起始相位,取值区间[0-2*PI)</param>
    /// <returns></returns>
    public System.Drawing.Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
    {
        System.Drawing.Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);

// 将位图背景填充为白色
        System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(destBmp);
        graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), 0, 0, destBmp.Width, destBmp.Height);
        graph.Dispose();

double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width;

for (int i = 0; i < destBmp.Width; i++)
        {
            for (int j = 0; j < destBmp.Height; j++)
            {
                double dx = 0;
                dx = bXDir ? (PI2 * (double)j) / dBaseAxisLen : (PI2 * (double)i) / dBaseAxisLen;
                dx += dPhase;
                double dy = Math.Sin(dx);

// 取得当前点的颜色
                int nOldX = 0, nOldY = 0;
                nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
                nOldY = bXDir ? j : j + (int)(dy * dMultValue);

System.Drawing.Color color = srcBmp.GetPixel(i, j);
                if (nOldX >= 0 && nOldX < destBmp.Width
                 && nOldY >= 0 && nOldY < destBmp.Height)
                {
                    destBmp.SetPixel(nOldX, nOldY, color);
                }
            }
        }

return destBmp;
    }

#endregion

/// <summary>
    /// 生成校验码图片
    /// </summary>
    /// <param name="code">验证码</param>
    /// <returns></returns>
    public Bitmap CreateImage(string code)
    {
        int fSize = FontSize;
        int fWidth = fSize + Padding;

int imageWidth = (int)(code.Length * fWidth) + 4 + Padding * 2;
        int imageHeight = fSize * 2 + Padding * 2;

System.Drawing.Bitmap image = new System.Drawing.Bitmap(imageWidth - 10, imageHeight - 10);

Graphics g = Graphics.FromImage(image);

g.Clear(BackgroundColor);

//给背景添加随机生成的燥点
        if (this.Chaos)
        {

Pen pen = new Pen(ChaosColor, 0);
            int c = ChaosWight * 10;

for (int i = 0; i < c; i++)
            {
                int x = rnd.Next(image.Width);
                int y = rnd.Next(image.Height);

g.DrawRectangle(pen, x, y, 1, 1);
            }
        }

int left = 0, top = 0, top1 = 1, top2 = 1;

int n1 = (imageHeight - FontSize - Padding * 2);
        int n2 = n1 / 4;
        top1 = n2;
        top2 = n2 * 2;

Font f;
        Brush b;

int cindex, findex;

//随机字体和颜色的验证码字符
        for (int i = 0; i < code.Length; i++)
        {
            cindex = rnd.Next(Colors.Length - 1);
            findex = rnd.Next(Fonts.Length - 1);

f = new System.Drawing.Font(Fonts[findex], fSize, System.Drawing.FontStyle.Bold);
            b = new System.Drawing.SolidBrush(Colors[cindex]);

if (i % 2 == 1)
            {
                top = top2;
            }
            else
            {
                top = top1;
            }

left = i * fWidth;

g.DrawString(code.Substring(i, 1), f, b, left, top);
        }

//画一个边框 边框颜色为Color.Gainsboro
        g.DrawRectangle(new Pen(Color.Gainsboro, 0), 0, 0, image.Width - 1, image.Height - 1);
        g.Dispose();

//产生波形(Add By 51aspx.com)
        image = TwistImage(image, true, 8, 4);

return image;
    }

/// <summary>
    /// 生成随机字符码
    /// </summary>
    /// <param name="codeLen">字符串长度</param>
    /// <param name="zhCharsCount">中文字符数</param>
    /// <returns></returns>
    public string CreateVerifyCode(int codeLen, int zhCharsCount)
    {
        char[] chs = new char[codeLen];

int index;
        for (int i = 0; i < zhCharsCount; i++)
        {
            index = rnd.Next(0, codeLen);
            if (chs[index] == '\0')
                chs[index] = CreateZhChar();
            else
                --i;
        }
        for (int i = 0; i < codeLen; i++)
        {
            if (chs[i] == '\0')
                chs[i] = CreateEnOrNumChar();
        }

return new string(chs, 0, chs.Length);
    }

/// <summary>
    /// 生成默认长度5的随机字符码
    /// </summary>
    /// <returns></returns>
    public string CreateVerifyCode()
    {
        return CreateVerifyCode(Length, 0);
    }

/// <summary>
    /// 生成英文或数字字符
    /// </summary>
    /// <returns></returns>
    protected char CreateEnOrNumChar()
    {
        return EnglishOrNumChars[rnd.Next(0, EnglishOrNumChars.Length)];
    }

/// <summary>
    /// 生成汉字字符
    /// </summary>
    /// <returns></returns>
    protected char CreateZhChar()
    {
        //若提供了汉字集,查询汉字集选取汉字
        if (ChineseChars.Length > 0)
        {
            return ChineseChars[rnd.Next(0, ChineseChars.Length)];
        }
        //若没有提供汉字集,则根据《GB2312简体中文编码表》编码规则构造汉字
        else
        {
            byte[] bytes = new byte[2];

//第一个字节值在0xb0, 0xf7之间
            bytes[0] = (byte)rnd.Next(0xb0, 0xf8);
            //第二个字节值在0xa1, 0xfe之间
            bytes[1] = (byte)rnd.Next(0xa1, 0xff);

//根据汉字编码的字节数组解码出中文汉字
            string str1 = Encoding.GetEncoding("gb2312").GetString(bytes);

return str1[0];
        }
    }

}

转载于:https://www.cnblogs.com/taofx/p/4139232.html

相关文章:

html 页面传值

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 直接上代码&#xff0c;JS保存全局变量的三种方式。 创建一个新的JS文件&#xff0c; //quanju.js window.localStorage.JQa"JQA"; window.localStorage.setItem(JQb,JQB);//利用localStora…

node.js的开发流程_Node.js子流程:您需要了解的一切

node.js的开发流程by Samer Buna通过Samer Buna Node.js子流程&#xff1a;您需要了解的一切 (Node.js Child Processes: Everything you need to know) 如何使用spawn()&#xff0c;exec()&#xff0c;execFile()和fork() (How to use spawn(), exec(), execFile(), and fork…

对象存在性检测集中管理

在中大型业务系统中&#xff0c; 常常需要从数据库中查询某个实体对象。 在进行处理之前&#xff0c; 必须先检测该实体是否存在&#xff0c;以增强系统的健壮性。 不过&#xff0c; 检测代码充斥在主业务流程中又会大大降低业务逻辑的清晰性&#xff0c; 最好集中起来进行管理…

20155204 2016-2017-2 《Java程序设计》第3周学习总结

20155204 2016-2017-2 《Java程序设计》第3周学习总结 教材学习内容总结 一个原始码中可以有多个类定义&#xff0c;但只能有一个公开类。留心Scanner对于每一种类型的nextxxxx()方法以Java开头的都是API提供的类使用Integer.valueOf()也是为基本类型建立打包器的方式之一Integ…

js表单提交,支持图片上传,包含后端php代码

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 <html><head><meta http-equiv"Content-Type" content"charsetutf-8" /><title>图片上传成功</title></head><body><form name"…

如何破解汽车-快速的速成课程

by Kenny Kuchera肯尼库切拉(Kenny Kuchera) 如何破解汽车-快速的速成课程 (How to hack a car — a quick crash-course) The goal of this article is to get you started hacking cars — fast, cheap, and easy. In order to do this, we’ll spoof the RPM gauge as an e…

367. Valid Perfect Square

题目&#xff1a; Given a positive integer num, write a function which returns True if num is a perfect square else False. Note: Do not use any built-in library function such as sqrt. Example 1: Input: 16 Returns: TrueExample 2: Input: 14 Returns: False 链接…

使用reuseport和recvmmsg优化UDP服务器

http://skoo.me/system/2014/03/18/udp-server-performance/ http://www.helplib.net/s/linux.die/65_3223/man-2-recvmmsg.shtml recvmmsg(2) - Linux man page转载于:https://www.cnblogs.com/jingzhishen/p/4145732.html

js把for循环出来的数据存入数组

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 var obj [];for(var i 0;i<obj.length;i){arr.push(obj[i]);}; console.obj(arr); 1&#xff1a;obj是一个数组对象 2&#xff1a;push()方法是数组的栈底添加 意思是往数组的底部添加 3&#xff1a…

flexbox布局_这是您可以使用FlexBox制作的5种布局

flexbox布局The CSS Flexible Box Layout — Flexbox — provides a simple solution to the design and layout problems designers and developers have faced with CSS. Let me show you how to use it to generate some common layouts and challenges that you will face …

数据结构之线性表

数据结构之线性表 目录 概述顺表特点 顺表的操作 准备 创建顺表 查询顺表长度 遍历顺表 按序查找 按值查找 插入 删除 链表实际使用概述 线性表是一种线性的存储结构&#xff0c;表头有唯一后继元素&#xff0c;表尾有唯一前驱元素&#xff0c;表中的元素既有前驱又有后继 顺表…

【BZOJ-3456】城市规划 CDQ分治 + NTT

题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id3456 Solution 这个问题可以考虑dp&#xff0c;利用补集思想 N个点的简单图总数量为$2^{\binom{N}{2}}$&#xff0c;要求的是简单联通图&#xff0c;所以可以用总量减不连通的。 不连通的可以通过枚举与某个固定点的…

微信小程序获取openid和session_key并且把openid存入数据库

微信小程序开发交流qq群 581478349 微信小程序获取openid和session_key并且把openid存入数据库。已经调用openid的demo 前后端代码都有&#xff0c;后端php实现 在其它地方同步调用openid。&#xff08;确保用户完成登录再进行后续的操作&#xff09;&#xff1b; onLoad…

如何通过五个简单步骤成为更好的Stack Overflow用户

by Artem Stepanenko由Artem Stepanenko 如何通过五个简单步骤成为更好的Stack Overflow用户 (How to become a better Stack Overflow user in five simple steps) Software developers cannot imagine their lives without Stack Overflow.没有堆栈溢出&#xff0c;软件开发…

wm_concat

select org_name,department,to_char(wm_concat(ebs_org_num)) from GHB.org_add_tmp group by org_name,department ; 转载于:https://www.cnblogs.com/pier22/p/6546726.html

5 MySQL索引

目录&#xff1a; 1. 索引概述 1.1 为什么引入索引 1.2 什么是索引 1.3 索引的好处 1.4 索引的不足 1.5 索引分类 2. 索引设计原则 3. 索引建立和删除 3.1 索引创建 3.2 索引删除 4. 索引实验 1. 索引概述 1.1 为什么引入索引[1] 问题&#xff1a;假设数据库中一个表有10^6条记…

js多维数组渲染HTML js for循环渲染页面

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 直接上代码&#xff0c;有不懂的可以留言。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><script src"https://cdn.bootcss.com/jquery/2.1.1/jquery…

使用TensorFlow跟踪千年猎鹰

by Nick Bourdakos由Nick Bourdakos 使用TensorFlow跟踪千年猎鹰 (Tracking the Millennium Falcon with TensorFlow) At the time of writing this post, most of the big tech companies (such as IBM, Google, Microsoft, and Amazon) have easy-to-use visual recognition…

POJ2387 Til the Cows Come Home -DIJKSTRA 练习

题目大意是&#xff1a;有N个牛棚和T条边相连&#xff0c;每条边有个权值&#xff0c;问1号到N号牛棚之间的最短距离 本题是又是DIJKSTRA最短路水题&#xff0c;注意任何两个牛棚之间可能有多条路相连&#xff0c;输入时先输入边&#xff0c;再输入点&#xff0c;程序如下&…

<a>标签带参数跳转并在下一个页面接收

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; <a href"home.html?id1">跳转</a> //home.html <script type"text/javascript"> var aGetRequest();console.log("id:"a[id]) //…

Linux上PHP加入环境变量

export PATH$PATH:/usr/local/php/bin转载于:https://www.cnblogs.com/ttiandeng/p/6554902.html

计算机本科学位有用吗_我应该回到学校获得计算机科学学位吗?

计算机本科学位有用吗by Preethi Kasireddy通过Preethi Kasireddy 我应该回到学校获得计算机科学学位吗&#xff1f; (Should I go back to school to get a Computer Science degree?) This week’s question for my “Ask Preethi’ series is one that’s near and dear t…

[bzoj1054][HAOI2008]移动玩具

题意&#xff1a;在一个4*4的方框内摆放了若干个相同的玩具&#xff0c;某人想将这些玩具重新摆放成为他心中理想的状态&#xff0c;规定移动 时只能将玩具向上下左右四个方向移动&#xff0c;并且移动的位置不能有玩具&#xff0c;请你用最少的移动次数将初始的玩具状态移动到…

微信小程序实现滑动tab切换和点击tab切换并显示相应的数据(附源代码)

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; 先上效果图&#xff1a; 这里主要用到了swiper组件和三目运算&#xff0c;直接上代码&#xff0c; 样式只有三个class&#xff0c;简单粗暴&#xff0c;懒的小伙伴们可以直接拿来用&a…

使用java.util.Timer来周期性的执行制定的任务

使用java.util.Timer来周期性的执行制定的任务 1 public class HandlerTest extends Activity {2 int[] images new int[] {3 R.drawable.baiyang, R.drawable.jinniu, R.drawable.shuangyu4 };5 6 int currentImageID 0;7 8 Override9 prot…

数据库更行通知_哪个更好? 数据驱动还是数据通知?

数据库更行通知by Casper Sermsuksan由Casper Sermsuksan 哪个更好&#xff1f; 数据驱动还是数据通知&#xff1f; (Which is better? Data-Driven or Data-Informed?) I recently spoke at the Tech in Asia Product Development Conference in Jakarta about being data-…

从某一日期开始过day天的日期

一个SX问我的&#xff0c;我就写了写......从2010.1.1开始&#xff0c;给了一组测试数据3的话输出2010.1.4星期1&#xff0c;所以说2010.1.1是星期五&#xff0c;总星期就是 (day5)%70?7:(day5)%7下面是代码...... #include <iostream> #include <stdlib.h> using…

dhtmlxgrid表格笔记

因为公司以前架构的需求&#xff0c;所以对于dhtmlxgrid进行了简单的学习&#xff0c;参照dhtmlxgrid给出的例子进行摸索 1、必须引入的js包 <link rel"STYLESHEET" type"text/css" href"css/dhtmlxgrid.css"> <link rel"stylesh…

配置 腾讯云 SSL 证书 SSL证书实现https,环境:phpStudy下Apache环境

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; SSL证书实现https&#xff0c;环境&#xff1a;phpStudy下Apache环境 前提条件&#xff1a; 1.申请并下载好腾讯云申请的免费 ssl证书 腾讯云免费证书申请地址&#xff1a; http…

把canvas放在盒子内_如何将您的专业知识放在盒子中并出售

把canvas放在盒子内At RISE Conf in Hong Kong, Gary Vaynerchuk was asked:在香港的RISE Con​​f会议上&#xff0c; 加里韦纳楚克被问到&#xff1a; How do I make a living off my passion?我如何以激情为生&#xff1f; The answer from the marketing mogul was strai…