locked
请问各位高手,ASP.NET中,如何画图啊?比如验证码上的小图片! RRS feed

  • 问题

  • 我是asp.net初学者,请各位高手指教,我做了一个验证码,但是有些错误和疑问,请各位高手指点一下啊!

    protected void Page_Load(object sender, EventArgs e)
        {
            CreatCheckCodeImage();
        }
        private string CreateCheckCodeString()
        {
            //定义用于验证码的字符数组
            char[] alchararray ={ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
            //定义验证码字符串
            string randomCode = "";
            Random rand = new Random();
            // 生成四位验证码字符串
            for (int i = 0; i < 4; i++)
            {
                randomCode += alchararray[rand.Next(alchararray.Length)];
            }
            return randomCode;
        }
        public void CreatCheckCodeImage()
        {
            Response.Write("测试");
            //定义图片的宽度和高度
            int iWidth = 55;
            int iHeight = 22;
            //定义大小为12pt的Arial的字体,用于绘制文字
            Font font = new Font("Arial", 12, FontStyle.Bold);
            //定义黑色的单色画笔,用于绘制文字
            SolidBrush brush = new SolidBrush(Color.Black);
            //定义钢笔,用于绘制干扰线
            Pen pen1 = new Pen(Color.Gray, 0);
            Pen pen2 = new Pen(Color.FromArgb(255, 100, 100, 100), 0);//这里根据ARGB值获得了一个Color对象
            // 创建一个px*20px的图像
            Bitmap image = new Bitmap(iWidth, iHeight);
            //从图像获取一个绘制图面
            Graphics g = Graphics.FromImage (image);
            //清楚整个绘图画面并以指定颜色填充
            g.Clear(ColorTranslator.FromHtml("#f0f0f0"));//这里从HTML颜色代码获得了Color对象
            //定义文字的绘制矩形区域
            RectangleF rect = new RectangleF(50, 20, iWidth, iHeight);
            //定义一个随机数对象,用于绘制干扰线
            Random rand = new Random();
            //生成两条横向的干扰线
            for (int i = 0; i < 2; i++)
            {
                //定义起点
                Point p1 = new Point(0, rand.Next(iHeight));
                Point p2 = new Point(iHeight, rand.Next(iHeight));
                //绘制直线
                g.DrawLine(pen1, p1, p2);
            }
            //生成四条纵向的干扰线
            for (int i = 0; i < 4; i++)
            {
                //定义起点
                Point p1 = new Point(rand.Next(iWidth), 0);
                Point p2 = new Point(rand.Next(iWidth), iHeight);
                //绘制直线
                g.DrawLine(pen2, p1, p2);
            }
            //绘制验证码文字
            g.DrawString(CreateCheckCodeString(), font, brush, rect);
           
            ////保存图片为Jpeg格式
            string sFilePath = @"E/";
            //image .Save (sFilePath ,System.Drawing.Imaging.ImageFormat.Jpeg );
            //释放对象
            g.Dispose();
            image.Dispose();
        }

    运行时, image.Save(sFilePath, System.Drawing.Imaging.ImageFormat.Jpeg);这一行出现一个错误:GDI+ 中发生一般性错误。

    还有如何把生成的图片显示在网页上啊?请各位高手指教啊!!!

    2008年11月4日 13:00

答案

  •  

    首先,要在网页上显示,你不能使用Response.Write("测试");输出任何的字符

    其次

    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    Response.ClearContent();
    Response.ContentType = "image/Png";
    Response.BinaryWrite(ms.ToArray());
    g.Dispose();
    image.Dispose();

    Response.End();

     

    显示方法:

    <img src="你的这个文件的.aspx" />

     

     

    2008年11月4日 14:30
    版主

全部回复

  •  

    首先,要在网页上显示,你不能使用Response.Write("测试");输出任何的字符

    其次

    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    Response.ClearContent();
    Response.ContentType = "image/Png";
    Response.BinaryWrite(ms.ToArray());
    g.Dispose();
    image.Dispose();

    Response.End();

     

    显示方法:

    <img src="你的这个文件的.aspx" />

     

     

    2008年11月4日 14:30
    版主
  • 非常感谢您的回答,确实输出来了!

    我还想问一下,如何能把输出的图片定位到一个特定的位置啊?

    2008年11月4日 14:41
  • 可以用来定位的,比如

     

     

    完整代码

     

    Code Snippet

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Drawing;
    using System.Drawing.Imaging;

    public partial class Default11 : System.Web.UI.Page
    {
      private string CreateCheckCodeString()
      { //验证字符数组
        char[] AllCheckCodeArray ={ '0','1','2','3','4','5','6','7','8','9','A','B','C',
            'D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W',
            'X','Y','Z'};
        //定义验证码字符串
        string randomcode = "";
        Random rd = new Random();
        //生成4位验证码字符串
        for (int i = 0; i < 4; i++)
          randomcode += AllCheckCodeArray[rd.Next(AllCheckCodeArray.Length)];
        return randomcode;
      }
      //生成验证码图片
      protected void Page_Load(object sender, EventArgs e)
      {
        CreatCheckCodeImage();
      }
      private void CreatCheckCodeImage()
      {
        //宽度
        int ImageWidth = 55;
        //高度
        int ImageHeigh = 22;
        //定义字体,用于绘制文字
        Font font = new Font("Arial", 12, FontStyle.Bold);
        //定义画笔,用于绘制文字
        Brush brush = new SolidBrush(Color.Black);
        //定义钢笔,用于绘制干扰线
        Pen pen1 = new Pen(ColorTranslator.FromHtml("#FF3399"), 0);//线条色彩定义
        Pen pen2 = new Pen(ColorTranslator.FromHtml("#FF9900"), 1);
        //创建一个图像
        Bitmap BitImage = new Bitmap(ImageWidth, ImageHeigh);
        //从图像获取一个绘画面
        Graphics graphics = Graphics.FromImage(BitImage);
        //清除整个绘图画面并用颜色填充
        graphics.Clear(ColorTranslator.FromHtml("#00CC00"));//这里从HTML代码获取color对象
        //定义文字的绘制矩形区域
        RectangleF rect = new RectangleF(5, 2, ImageWidth, ImageHeigh);
        //定义一个随机数对象,用于绘制干扰线
        Random rand = new Random();
        //生成两条横向的干扰线
        for (int i = 0; i < 2; i++)
        {
          //定义起点
          Point p1 = new Point(0, rand.Next(ImageHeigh));
          //定义终点
          Point p2 = new Point(ImageWidth, rand.Next(ImageHeigh));
          //绘制直线
          graphics.DrawLine(pen1, p1, p2);
        }
        //生成两条纵向的干扰线
        for (int i = 0; i < 2; i++)
        {
          //定义起点
          Point p1 = new Point(rand.Next(ImageWidth), 0);
          //定义终点
          Point p2 = new Point(rand.Next(ImageWidth), ImageHeigh);
          //绘制直线
          graphics.DrawLine(pen2, p1, p2);
        }
        //绘制验证码文字
        String code = CreateCheckCodeString();
        Session["CheckCode"] = code;
        graphics.DrawString(code, font, brush, rect);
        //保存图片为gif格式
        BitImage.Save(Response.OutputStream, ImageFormat.Gif);
        //释放对象
        graphics.Dispose();
        BitImage.Dispose();
      }
    }

     

     

     

    2008年11月4日 14:46
    版主
  • 又要麻烦您了老师,我还是不太清楚如何定位图片显示的位置,我用您的代码还是只能输出到页面的左上角。能不能把它定位到一个表格里或一个控件里啊?我的意思就是如何把验证码图片放到要输入验证码文本框的后面!^_^

     

    2008年11月4日 15:04
  • 明白了老师,谢谢您的帮助,昨晚没看见您一开始发的最后一段代码!^_^无限感激!

    2008年11月5日 12:05
  •  

    老师啊,又要麻烦您了,图片是显示出来了,但是如何访问图片中的字符串啊,我在绘制图片代码段中添加Session和Cookies都不管啊!怎么办啊?
    2008年11月5日 12:59