当前位置: 代码迷 >> ASP.NET >> 图片验证码生成有关问题~
  详细解决方案

图片验证码生成有关问题~

热度:5098   发布时间:2013-02-25 00:00:00.0
图片验证码生成问题~~~
以下是个生成验证码的代码.请问如果让生成出来的随机字符不规则的倾斜?????
C# code
using System;using System.Collections;using System.Configuration;using System.Data;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;using System.Web.SessionState;using System.Drawing;using System.Drawing.Imaging; namespace FyCms.Web{    public partial class ImgCode : System.Web.UI.Page    {        protected void Page_Load(object sender, EventArgs e)        {            DrawCode();        }        public void DrawCode()        {            int width = 65;            int height = 25;            //定义一个随机变量            Random rand = new Random();            //创建图象            Bitmap img = new Bitmap(width, height);            //从图象上获取一个绘画图            Graphics g = Graphics.FromImage(img);            try            {                //定义字体                Font font = new Font("Comic sans ms", 11, FontStyle.Bold);                Font font = new Font(FontItems[fontIndex], 11, return FontStyle.Regular | FontStyle.Bold;);                //定义黑色画笔                SolidBrush brush = new SolidBrush(Color.Black);                //定义钢笔,绘制干扰线                Pen pen1 = new Pen(Color.Gray);                Pen pen2 = new Pen(Color.Gray);                //清除整个绘画图面并以指定颜色填充                g.Clear(ColorTranslator.FromHtml("#FFFFFF"));                //定义文字的绘制矩形区域                Rectangle rect = new Rectangle(2, 2, width, height);                //定义一个随机数用于绘制干扰线                //生成两条横向干扰线                for (int i = 0; i < 2; i++)                {                    //Define Point1                    Point p1 = new Point(0, rand.Next(height));                    //Define Point2                    Point p2 = new Point(width, rand.Next(height));                    g.DrawLine(pen1, p1, p2);                }                //生成四条纵向干扰线                for (int i = 0; i < 4; i++)                {                    //Define Point1                    Point p1 = new Point(rand.Next(width), 0);                    //Define Point2                    Point p2 = new Point(rand.Next(width), height);                    //DrawLine                    g.DrawLine(pen2, p1, p2);                }                string strsj = strRand();                g.DrawString(strsj, font, brush, rect);                //输出图象                            img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);                Session["ImgCode"] = strsj.ToLower();                //return strRand().ToLower();            }            catch (Exception error)            {                throw new Exception(error.Message);            }            finally            {                g.Dispose();                img.Dispose();            }        }        //产生随机数        public string strRand()        {   //验证码范围            char[] strCode = {                                '1', '2', '3', '4', '5', '6', '7', '8', '9',                                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',                                'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S',                               'T', 'U', 'V', 'W', 'X', 'Y', 'Z'                              };            string strRandomCode = "";            Random random = new Random();            if (Session["ImgCode"] == null)            {                for (int i = 0; i < 4; i++)                {                    strRandomCode += strCode[random.Next(strCode.Length)];                                   }                            }            else            {                strRandomCode += Session["ImgCode"];            }            return strRandomCode;        }    }}


------解决方案--------------------------------------------------------
不错,帮顶

------解决方案--------------------------------------------------------
帮忙顶下,
那就多几个验证字母吧
------解决方案--------------------------------------------------------
修改 Rectangle rect = new Rectangle(2, 2, width, height);

------解决方案--------------------------------------------------------
实现乱倾斜可多定义几种字体如:
可在你的代码里加:

C# code
//定义图片弯曲的角度int srseedangle = 45;//定义字体string[] srFonts ={ "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };Random srRandom= new Random();Font srFont = new Font(srFonts[srRandom.Next(5)], srRandom.Next(12,20), FontStyle.Regular);//定义倾斜角度float srangle = srRandom.Next(-srseedangle, srseedangle);//定义坐标Point srPoint = new Point(16, 16);g.TranslateTransform(srPoint.X, srPoint.Y);g.RotateTransform(srangle);
------解决方案--------------------------------------------------------
//定义倾斜角度 
srRandom.Next(-srseedangle, srseedangle); 


------解决方案--------------------------------------------------------
Graphics有个RotateTransform方法

这个srangle数据就是这个方法的参数
------解决方案--------------------------------------------------------
FillRectangle
http://www.cnblogs.com/ghostljj/archive/2007/10/09/917993
------解决方案--------------------------------------------------------
C# code
//具体代码就是这样,没有调试,可能有错误,你自己到vs里测试下public void DrawCode()        {            int width = 65;            int height = 25;            //定义一个随机变量            Random rand = new Random();            //定义图片弯曲的角度            int srseedangle = 45;            //创建图象            Bitmap img = new Bitmap(width, height);            //从图象上获取一个绘画图            Graphics g = Graphics.FromImage(img);            try            {                //定义字体                Font font = new Font("Comic sans ms", 11, FontStyle.Bold);                //字体数组                string[] srFonts ={ "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };                //颜色数组                Color[] srColors ={ Color.Black,Color.Red,Color.DarkBlue,Color.Blue,Color.Orange,Color.Brown,Color.DarkCyan,Color.Purple};                Font font = new Font(FontItems[fontIndex], 11, return FontStyle.Regular | FontStyle.Bold;);                //定义黑色画笔                SolidBrush brush = new SolidBrush(Color.Black);                //定义钢笔,绘制干扰线                Pen pen1 = new Pen(Color.Gray);                Pen pen2 = new Pen(Color.Gray);                //清除整个绘画图面并以指定颜色填充                g.Clear(ColorTranslator.FromHtml("#FFFFFF"));                //定义文字的绘制矩形区域                Rectangle rect = new Rectangle(2, 2, width, height);                //定义一个随机数用于绘制干扰线                //生成两条横向干扰线                for (int i = 0; i < 2; i++)                {                    //Define Point1                    Point p1 = new Point(0, rand.Next(height));                    //Define Point2                    Point p2 = new Point(width, rand.Next(height));                    g.DrawLine(pen1, p1, p2);                }                //生成四条纵向干扰线                for (int i = 0; i < 4; i++)                {                    //Define Point1                    Point p1 = new Point(rand.Next(width), 0);                    //Define Point2                    Point p2 = new Point(rand.Next(width), height);                    //DrawLine                    g.DrawLine(pen2, p1, p2);                }                string strsj = strRand();                for(int i=0;i<strsj.length;i++)                {                    //定义字体 参数分别为字体样式 字体大小 字体字形                    Font srFont = new Font(srFonts[rand.Next(5)], rand.Next(12,20), FontStyle.Regular);                    //填充图形                    Brush srBrush = new SolidBrush(srColors[rand.Next(7)]);                    //定义坐标                    Point srPoint = new Point(16, 16);                    //定义倾斜角度                    float srangle = rand.Next(-srseedangle, srseedangle);                    //倾斜                    g.TranslateTransform(srPoint.X, srPoint.Y);                    g.RotateTransform(srangle);                    //填充字符                    g.DrawString(strsj.Substring(i,1),srFont,srBrush,1,1,new StringFormat(StringFormatFlags.NoClip));                    g.RotateTransform(-srangle);                    g.TranslateTransform(2,-srPoint.Y);                    //g.DrawString(strsj, font, brush, rect);                }                //输出图象                            img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);                Session["ImgCode"] = strsj.ToLower();                //return strRand().ToLower();            }            catch (Exception error)            {                throw new Exception(error.Message);            }            finally            {                g.Dispose();                img.Dispose();            }        }
  相关解决方案