欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET图片处理三类经典问题

程序员文章站 2024-02-16 13:29:52
 我们在做web程序的时候经常会遇到一些图片处理的问题,今天就把遇到的需要图片处理的地方给总结一下。也算是对自己学习过程的一个总结,希望也能给大家一些启发。 一...

 我们在做web程序的时候经常会遇到一些图片处理的问题,今天就把遇到的需要图片处理的地方给总结一下。也算是对自己学习过程的一个总结,希望也能给大家一些启发。
一、验证码。
我们在某些网站注册或者登录的时候,都可能遇到要填写验证码的地方,当时没搞懂这样的图片是怎样一回事,事实上这是一张随机生成的图片,需要在后台专门新建一个aspx页或者ashx一般程序处理页来专门负责生成这样的图片。下面就通过示例向大家演示这样的一个过程!
首先我们新建一个登录页,模拟用户登录。代码如下: 

<div>
 <table>
 <tr><td>账号:</td><td>
  <asp:textbox id="textbox1" runat="server"></asp:textbox></td></tr>
 <tr><td>密码:</td><td>
  <asp:textbox id="textbox2" runat="server" textmode="password"></asp:textbox></td></tr>
 <tr><td>验证码:</td><td>
  <asp:image id="image1" runat="server" imageurl="validateno.aspx" /></td></tr>
 <tr><td>请输入:</td><td>
  <asp:textbox id="txtyzm" runat="server"></asp:textbox></td></tr>
  <tr><td>
   <asp:button id="btndl" runat="server" text="登录" onclick="btndl_click" /></td><td>
    <asp:button id="button2" runat="server" text="取消" causesvalidation=false /></td></tr>
 </table>
 </div>

布局如图:

ASP.NET图片处理三类经典问题

然后再新建一个validateno.aspx页,用来生成验证码图片,在这个aspx页中只需要在构造函数中写如下代码即可:

protected void page_load(object sender, eventargs e)
  {
   random r = new random();
   int i = r.next(1000, 9999);//生成一个四位的随机数
   bitmap bit = new bitmap(100, 40);//生成一个尺寸为100,40的位图
   graphics g = graphics.fromimage(bit);//创建一个绘图实例,并以上边创建的的位图为画板,当然这里边也以选择一张已有的图片作为画板。只需要将fromimage()里的参数换位已存在的image对象即可
   g.drawline(new pen(brushes.blue), new point(0, 10), new point(100, 10));
   g.drawline(new pen(brushes.greenyellow), new point(0, 25), new point(100, 25));//画两条直线,起到一定的模糊验证的码的效果
   g.drawstring(i.tostring(), new font("宋体", 30), brushes.green, new pointf(0, 0));//将生成的四位数的验证码绘到该画板上
   bit.save(response.outputstream, imageformat.jpeg);//将该位图保存为jpeg的格式
   session["validateno"] = i.tostring();//seession值保存生成的验证码的值,以便在登录的时候和用户输入的验证码的值做比较
   response.contenttype = "image/jpeg";//将输入类型改为“image/jpeg"
   response.end();
  }

刚刚我们在代码里有说到将生成的随机验证码保存在seesion中,那么我们在登录的时候就可以根据session中值的和用户输入的值做比较,以此来判断用户输入验证码是否正确,所以我们在登录页的aspx.cs页做出这样的处理:(这里只是模拟测试,在实际的开发中,如果验证码、密码、账号都正确的话,就会导向新的页面)

protected void btndl_click(object sender, eventargs e)
  {
   if (session["validateno"] != null)
   {
    string s = session["validateno"].tostring();
    if (txtyzm.text != s)
    {
     response.write("<script>alert('"+s+"')</script>");
    }
    else
    {
     response.write("<script>alert('ok')</script>");
    }
   }
   else
   {
    response.write("<script>alert('验证码暂不存在!')</script>");
   }
  }

二、给图片加文字

有时候我们会看到有些个人空间或主页的图片都加有相应的文字,就像腾讯微博那种发一张图片会显示腾讯微博字样。下面我就给大家展示下如何在图片上添加文字。

首先我们新建一个aspx页,页面布局如下:

 <table style="background:lightblue"><tr><td>选择上传文件:</td><td><asp:fileupload id="fileupload1" runat="server" /></td><td>
   <asp:button id="btnupload" runat="server" text="上传图片"
    onclick="btnupload_click" /></td></tr>
  <tr><td colspan="3">
   <asp:image id="touxiang" runat="server" /></tr>
 </table> 
然后我们在btnuplod按钮的click事件的处理函数中做如下操作:
 
protected void btnupload_click(object sender, eventargs e)
  {
   if (fileupload1.filename.trim() != "")
   {
    string extension = path.getextension(fileupload1.filename);//先获取文件的后缀
    string filename = datetime.now.year.tostring() + datetime.now.month.tostring() + datetime.now.minute.tostring();//以当前的日期,以年月分的格式为上传的图片重命名
    string path = server.mappath(".")+"\\images\\"+filename + extension;
    fileupload1.postedfile.saveas(path);//将图片保存在指定路径下
    bitmap img = new bitmap(path);//新建一个bitmap对象并以此为画板
    graphics g = graphics.fromimage(img);
    g.drawstring("hello olive!", new font("宋体", 30), brushes.greenyellow, new pointf(20,20) );//将"hello olive"书写在图片的(20,20)处
    g.dispose();
    newpath = server.mappath(".") + "\\images\\" + filename + "_new" + extension;
    img.save(newpath);//将加有文字的图片重新命名并保存,并删除原来的图片
    img.dispose();
    if (file.exists(path))
    {
     file.delete(path);
    }
    touxiangpath="~/images/" + filename + "_new" + extension;
   }
   else
   {
    response.write("<script>alert('请先选择要上传的文件!')</script>");
   }
  }

效果如图:

ASP.NET图片处理三类经典问题

三、生成略缩图
现在的很多博客、个人主页、空间之类的都有编辑个人信息的设置,在编辑个人信息的时候都可能会需要上传头像,下面我们来讲一下如何生成略缩头像。
页面布局的话我们还是引用上边的布局:
但是要在<table></table>再加一行,用来显示生成的略缩图。
首先我们需要新建一个cutimage类cutimage.cs,专门用来对图片进行缩放,如下:
       /// <summary>(该图片缩放的代码参考自博客园博主king-两色天)
        /// 截取图片
        /// </summary>
        /// <param name="opath">原图片路径</param>
        /// <param name="npaht">新图片路径</param>
        /// <param name="w">略缩图的宽度</param>
        /// <param name="h">略缩图的高度</param>
        /// <param name="mode">截取模式</param>
 代码:   

public static void cutimg(string opath, string npaht, int w, int h,string mode)
  {
   image oimg = image.fromfile(opath);
   int ntowidth = w;
   int ntoheight = h;
   int x = 0;
   int y = 0;
   int owidth = oimg.width;
   int oheight = oimg.height;
   switch (mode)
   {
    case "hw"://按照指定的宽高进行缩放,可能变形
     break;
    case "w"://指定宽度,高按比例缩放
     ntoheight = owidth * oheight / ntowidth;
     break;
    case "h"://指定高度,宽按比例缩放
     ntowidth=owidth*oheight/ntoheight;
     break;
    case "cut"://按照指定的宽、高缩放
     if ((oimg.width / oimg.height) > (ntowidth / ntoheight))
     {
      oheight = oimg.height;
      owidth = oimg.height * ntowidth / ntoheight;
      y = 0;
      x = (oimg.width - owidth) / 2;
     }
     else
     {
      owidth = oimg.width;
      oheight = oimg.width * ntoheight / ntowidth;
      x = 0;
      y = (oimg.height - oheight) / 2;
     }
     break;
    default: break;
   }
   //新建一个bmp图片
   image bitmap = new bitmap(ntowidth, ntoheight);
   //新建一个画板
   graphics gp = graphics.fromimage(bitmap);
   gp.interpolationmode = interpolationmode.high;
   gp.smoothingmode = system.drawing.drawing2d.smoothingmode.highquality;
   //清空画布,并以背景色为透明色填充
   gp.clear(color.transparent);
   gp.drawimage(oimg, new rectangle(0, 0, ntowidth, ntoheight), new rectangle(x, y, owidth, oheight), graphicsunit.pixel);//绘制出新的略缩图
   try
   {
    bitmap.save(npaht, system.drawing.imaging.imageformat.jpeg);
   }
   catch(exception e)
   {
    throw e;
   }
   finally
   {
    oimg.dispose();
    bitmap.dispose();
   }
  }

然后我们的aspx页的btnupload按钮的click事件的处理函数代码如下:

 protected void btnupload_click(object sender, eventargs e)
  {
   if (fileupload1.filename.trim() != "")
   {
     //.......
     //.......前边都省略了代码是一样的
      if (file.exists(path))
    {
     file.delete(path);
    }
    string p = server.mappath(".") + "\\images\\";
    touxiangpath="~/images/" + filename + "_new" + extension;
    touxiang.imageurl = touxiangpath;
    cutimage.cutimg(newpath, p+"olive.jpg", 100, 200, "cut");//调用缩放图片的类cutimage的cutimg函数,这里直接保存为了“olive.jpg"是为了方便下面的引用显示,也可保存为其他的名称和格式。
     luesuotu.imageurl = "~/images/olive.jpg";
   } 
   else
   {
    response.write("<script>alert('请先选择要上传的文件!')</script>");
   }
  }

生成效果如图:

ASP.NET图片处理三类经典问题

为了方便大家的使用我已经把图片缩放功能封装成了一个类,里边还有其他的一些缩放的功能,已经导出了类模板,有兴趣的朋友可以点击下载imagecut.zip,希望可以给大家一些帮助。