效果图:

底层类:

/// <summary>

        /// 生成验证码

        /// </summary>

        /// <param name="len">验证码长度</param>

        /// <returns></returns>

        private static string CreateRandomCode(int len) {

            System.Random rand = new Random();

            string randomCode = "";//随机码

            char[] Allchar = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'T', 'Q', 'W', 'X', 'Y', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 't', 'w', 'x',
'y', 'z' };

            for (int i = 0; i < len; i++) {

                //生成一个小于Allchar.Length的随机数

                int a = rand.Next(Allchar.Length);

                randomCode += Allchar[a].ToString();

            }

            //验证码

            return randomCode;

        }

        /// <summary>

        /// 生成验证码,填充到PictureBox中

        /// </summary>

        /// <param name="len">验证码长度</param>

        /// <param name="pic">PictureBox名称</param>

        /// <param name="revolve">旋转度数</param>

        /// <param name="picHeight">图片高度</param>

        /// <param name="picWidth">图片宽度</param>

        /// <param name="charDistance">验证码中各个字符间距</param>

        /// <param name="fontSize">验证码字符的大小</param>

        public static string CreatePic(int len, PictureBox pic, int revolve, int picHeight, int picWidth, int charDistance, float fontSizes) {          

                //获取验证码

                string strCode = CreateRandomCode(len);

                //创建背景图片

                Bitmap map = new Bitmap(picWidth, picHeight);



                Graphics grap = Graphics.FromImage(map);

                //清除画面,填充背景色为AliceBlue

                grap.Clear(Color.AliceBlue);

                //画一个矩形边框

                grap.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - 1, map.Height - 1);



                //模式

                grap.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;



                //画噪点

                System.Random rand = new Random();

                for (int i = 0; i < 50; i++) {

                    int x = rand.Next(0, map.Width - 1);

                    int y = rand.Next(0, map.Height - 1);

                    grap.DrawRectangle(new Pen(Color.Gray, 0), x, y, 1, 1);

                }





                //把字符串拆成单个字符

                char[] chars = strCode.ToCharArray();



                //文字居中

                StringFormat format = new StringFormat(StringFormatFlags.NoClip);

                format.Alignment = StringAlignment.Center;

                format.LineAlignment = StringAlignment.Center;



                //定义颜色

                Color[] colors = { Color.Red, Color.Black, Color.Blue, Color.Green, Color.Orange, Color.DarkCyan, Color.Purple };



                //定义字体

                string[] fonts = { "Arial", "Verdana", "Georgia", "Cambria Math", "华文中宋" };



                for (int j = 0; j < len; j++) {

                    //颜色,字体的随机数,随机数作为下标

                    int cindex = rand.Next(colors.Length);

                    int findex = rand.Next(fonts.Length);

                    //字符颜色

                    Brush b = new System.Drawing.SolidBrush(colors[cindex]);

                    //字体样式、大小

                    System.Drawing.Font f = new System.Drawing.Font(fonts[findex], fontSizes, FontStyle.Bold);

                    //定义一个点

                    System.Drawing.Point p = new System.Drawing.Point(16, 20);



                    //转动的角度数

                    float angle = rand.Next(-revolve, revolve);

                    //移动光标到指定位置

                    grap.TranslateTransform(p.X, p.Y);

                    //转动angle度

                    grap.RotateTransform(angle);

                    //赋值

                    grap.DrawString(chars[j].ToString(), f, b, 1, 1, format);



                    //转动回去

                    grap.RotateTransform(-angle);

                    //移动光标到指定位置

                    grap.TranslateTransform(charDistance, -p.Y);

                }



                pic.Image = map;

                pic.SizeMode = PictureBoxSizeMode.StretchImage;      

         

                return strCode;

        }

前台调用:

说明:

(1)窗体要有一个PictureBox控件

(2)DataAccess 是底层类名称

DataAccess.CreatePic(4, pic, 50, 40, 100, 3, 20);

版权声明:本文为博主原创文章,未经博主允许不得转载。

winfrom 底层类 验证码 分类: C# 2014-12-17 11:18 258人阅读 评论(0) 收藏的更多相关文章

  1. 百度编辑器UEditor ASP.NET示例Demo 分类: ASP.NET 2015-01-12 11:18 346人阅读 评论(0) 收藏

    在百度编辑器示例代码基础上进行了修改,封装成类库,只需简单配置即可使用. 完整demo下载 版权声明:本文为博主原创文章,未经博主允许不得转载.

  2. iOS自定义字体及类目 分类: ios技术 2015-05-15 16:34 195人阅读 评论(0) 收藏

    1:获取字体文件 从各种渠道下载字体文件ttf, 网站或者从别的ipa里扣出来.(以fzltxh.ttf为例) 2:将fzltxh.ttf文件拷贝到工程中 3:在Info.plist中添加项: Fon ...

  3. C语言之void类型及void指针 分类: C/C++ 2015-07-13 11:24 8人阅读 评论(0) 收藏

    原文网址:http://www.cnblogs.com/pengyingh/articles/2407267.html 1.概述 许多初学者对C/C 语言中的void及void指针类型不甚理解,因此在 ...

  4. Retinex系列之McCann99 Retinex 分类: 图像处理 Matlab 2014-12-03 11:27 585人阅读 评论(0) 收藏

    一.McCann99 Retinex McCann99利用金字塔模型建立对图像的多分辨率描述,自顶向下逐层迭代,提高增强效率.对输入图像的长宽有 严格的限制,要求可表示成 ,且 ,. 上述限制来源于金 ...

  5. Least Common Ancestors 分类: ACM TYPE 2014-10-19 11:24 84人阅读 评论(0) 收藏

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  6. 二分图匹配(KM算法)n^4 分类: ACM TYPE 2014-10-04 11:36 88人阅读 评论(0) 收藏

    #include <iostream> #include<cstring> #include<cstdio> #include<cmath> #incl ...

  7. Segment Tree with Lazy 分类: ACM TYPE 2014-08-29 11:28 134人阅读 评论(0) 收藏

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; stru ...

  8. 8大排序算法图文讲解 分类: Brush Mode 2014-08-18 11:49 78人阅读 评论(0) 收藏

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序. ...

  9. Poj 1029 分类: Translation Mode 2014-04-04 10:18 112人阅读 评论(0) 收藏

    False coin Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16418   Accepted: 4583 Descr ...

随机推荐

  1. C++资源之不完全导引 (转载)

    C++资源之不完全导引(完整版)- - 这文章太强了,我一定要转载,否则对不起观众,对不起自己.(liigo) 发信人: NULLNULL (空空), 信区: VC标  题: C++资源之不完全导引( ...

  2. ecshop---京东手机模板js的eval产生冲突的解决方法。

    今天弄ecshop手机模板的时候,发现首页的广告图出不来,js报错

  3. 【转】Hibernate各种主键生成策略与配置详解

    原文转自:Fra~~kaka's Blog 1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无 ...

  4. Android中WebView的JavaScript代码和本地代码交互的三种方式

    一.Android中WebView的漏洞分析最近在开发过程中遇到一个问题,就是WebView使用的时候,还是需要解决之前系统(4.2之前)导致的一个漏洞,虽然现在这个系统版本用户很少了,但是也不能忽视 ...

  5. dedecms织梦如何删除所有的文章?

    dedecms织梦如何删除所有的文章?dede一键删除所有文章的SQL命令:  DELETE FROM dede_addonarticle WHERE aid >= 1 and aid<= ...

  6. Linux下glui 的安装,以及错误解决

    下载源文件: http://sourceforge.net/projects/glui/ 2. 解压源文件 3. 用terminal进入glui-2.36/src文件 4. make 5. make之 ...

  7. Sharepoint 问题集锦 - 外部列表(external list) - 读取当前用户上下文或用户名作为筛选参数

    在创建外部列表过程中,往往需要添加筛选参数,而较多开发用户,会关心如何在外部列表中,只显示当前用户相关的行.本例子中,我们以任务数据表来做例子,看看如何实现这个需求. 1)数据表tbl_task: t ...

  8. Prototype:Copy和Clone

    原型模式在C#中的实现比较直接,因为只需要继承了IClone的接口,就可以通过重写Clone方法,调用MemberwiseClone()来实现ProtoType的方式. class Test:IClo ...

  9. 数据结构练习 01-复杂度2. Maximum Subsequence Sum (25)

    Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...

  10. bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 314  Solved: 132[Submit][Sta ...