验证码生成源码

原创 2015年11月19日 20:37:39

1.首先生成不重复的字符串,以下是主要代码:

                                                  int rep = 0;
            string str = string .Empty;
            long num2 = DateTime .Now.Ticks + rep;
            rep++;
            Random random = new Random(((int )(((ulong)num2) & 0xffffffffL)) | (( int)(num2 >> rep)));
            for (int i = 0; i < 4; i++)
            {
                char ch;
                int num = random.Next();
                if ((num % 2) == 0)
                {
                    ch = ( char)(0x30 + ((ushort )(num % 10)));
                }
                else
                {
                    ch = ( char)(0x41 + ((ushort )(num % 0x1a)));
                }
                str = str + ch.ToString();
            }

            Code = str;
该算法会生成0,o,1,i等容易混淆的字符,后期我们会稍作调整。
2.生成字符过后,我们需要把字符生成图片。
int randAngle = 45;            //随机转动角度
            int mapwidth = (int )(Code.Length * 22);
            Bitmap map = new Bitmap(mapwidth, 28);                            //创建图片背景
            Graphics graph = Graphics .FromImage(map);
            graph.Clear( Color.AliceBlue);              //清除画面,填充背景


            Random rand = new Random();

            //验证码旋转,防止机器识别
            char[] chars = Code.ToCharArray();            //拆散字符串成单字符数组

            //文字距中
            StringFormat format = new StringFormat (StringFormatFlags.NoClip);
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment .Center;
            ////再画一条曲线连接所有字符

            double x1 = 10;
            double y1 = 0;
            for (double x = 1; x < 720; x++)
            {
                Pen pen = new Pen( Color.Blue, rand.Next(3));
                //SIN最大值为1,而我图上用了 100像素, 所以有
                //100/1=100  故而y 要乘100;
                // x/180*Math.PI 这个表达式把角度换成弧度值
                double y = Math .Sin(x / 180 * Math.PI) * 28;

                //SIN值一个循环为360度,而我图上用了 200像素表示,所以有:
                //360/200=1.8 故而x 值要除1.8
                graph.DrawLine(pen, ( float)x1, (float )y1 + 1, (float )(x) + 1, (float)y + 1);
                x1 = x + 1;
                y1 = y;
            }

            string[] fontArray = { "Verdana" , "Microsoft Sans Serif", "Comic Sans MS" , "Arial", "宋体" };
            for (int i = 0; i < chars.Length; i++)
            {
                Font fontstyle = new Font(fontArray[rand.Next(5)], rand.Next(20, 22), FontStyle.Regular);            //字体样式
                Point dot = new Point(rand.Next(14, 16), 16);
                //graph.DrawString(dot.X.ToString(),  fontstyle,  new  SolidBrush(Color.Black),  10,  150);                //测试X坐标显示间距的
                float angle = rand.Next(-randAngle, randAngle);            //转动的度数

                graph.TranslateTransform(dot.X, dot.Y);          //移动光标到指定位置
                graph.RotateTransform(angle);
                graph.DrawString(chars[i].ToString(), fontstyle, new SolidBrush( Color.Blue), 1, 1, format);
                graph.RotateTransform(-angle);                    //转回去
                graph.TranslateTransform(2, -dot.Y);          //移动光标到指定位置
            }

            //生成图片
            System.IO. MemoryStream ms = new System.IO.MemoryStream ();
            map.Save(ms, System.Drawing.Imaging.ImageFormat .Gif);
            CodeMap = new Bitmap (map);
            graph.Dispose();
            map.Dispose();

详解地址:http://www.517up.com/chat/%E4%BB%8E%E9%AA%8C%E8%AF%81%E7%A0%81%E8%AF%B4%E8%B5%B7?postbadges=true
版权声明:本文为博主原创文章,未经博主允许不得转载。

MFC验证码生成源代码

  • 2009年06月04日 11:35
  • 331KB
  • 下载

随机生成验证码java源码

  • 2014年04月10日 20:31
  • 791B
  • 下载

java生成图片验证码的源码

package com.hzjw.common; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; im...
  • gladmustang
  • gladmustang
  • 2014年10月28日 16:42
  • 1340

验证码图片生成源码

package com.liyunpeng.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics...
  • li13523456109
  • li13523456109
  • 2014年03月03日 15:17
  • 473

生成图形验证码

package com.zrj.platform.base.common; import java.awt.Color; import java.awt.Font; import jav...
  • qian_348840260
  • qian_348840260
  • 2016年11月30日 17:40
  • 315

Java简单验证码原理(源代码+步骤操作)

本文章一共分为四步: 一、新建名为:CheckCodeServlet的servlet类 二、复制以下代码到新建的CheckCodeServlet类中,修改自己的包名 package com.see...
  • seesun2012
  • seesun2012
  • 2016年05月10日 13:25
  • 3200

使用Response输出随机图片(随机生成验证码)

源代码 CheckCodeServlet.javapackage blank.servlet;import java.io.IOException; import java.io.PrintWrit...
  • LeoLeoHan
  • LeoLeoHan
  • 2015年03月17日 21:53
  • 1365

Java生成图片验证码(有点仿QQ验证码的意思)

看了挺多图片验证码的代码,感觉没什么长的好看点的,就自己动手写了个,写完发现跟QQ的有几分相似,比较满意。 功能包括:自定义图片尺寸和字符长度,随机背景颜色和字符颜色,随机字符偏移角度,字符平滑边缘,...
  • ruixue0117
  • ruixue0117
  • 2014年04月02日 23:32
  • 63977

生成验证码的几种方式

1,在jsp页面中直接生成验证码 //image.jsp
  • yhzhaohy
  • yhzhaohy
  • 2016年09月04日 20:06
  • 8135

后台登录(包含验证码)的php代码实现

login.html文件 login in 用户名: 密码: 验证码:      code.php文件 session_start();// // Set the...
  • whq19890827
  • whq19890827
  • 2014年10月17日 14:53
  • 2043
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:验证码生成源码
举报原因:
原因补充:

(最多只允许输入30个字)