信息发布软件,b2b软件,广告发布软件

标题: ASP.NET中图象处理过程详解和三类经典案例让您一步就学会了 [打印本页]

作者: 信息发布软件    时间: 2017-5-11 22:22
标题: ASP.NET中图象处理过程详解和三类经典案例让您一步就学会了

在使用ASP的时候,我们时常要借助第三方控件来实现一些图象功能。而现在,ASP.NET的推出,我们已经没有必要再使用第三方控件来实现,因为ASP.NET 已经具有强大的功能来实现一些图象处理。现在,我们就来看看怎样使用ASP.NET的这一强大功能。

  一、System.Drawing的使用

  以下的举例将演示在内存中生成一张图片,然后,将这张图片通过网页显示出来。需要了解的是,我们这里输出的不是HTML效果,而是实实在在的图片(图象),我们可以使用“另存为…”将输出图象保存起来。

  我们先来看看效果:


  我们看到,这张图片是一个渐变背景上有“看见了吗”几个字,当然,这个效果在PhotoShop等图象处理软件里面很容易实现,但是,一些与数据库结合的应用我们不可能将所有图片都事先设计出来,这时候,利用ASP.NET来实现这些功能就显得很重要了。我们来看源代码:

  <%@ page language="vb" contenttype="image/jpeg" %>

  <%@ import namespace="system.drawing" %>

  <%@ import namespace="system.drawing.imaging" %>

  <%@ import namespace="system.drawing.drawing2d" %>


  <%

  '清空Response

  response.clear


  '建立一个120*30大小,24bit的BMP图象;

  dim imgOutput as New bitmap(120, 30, pixelformat.format24bpprgb)


  '根据以上BMP建立一个新图象;

  dim g as graphics = graphics.fromimage(imgOutput)


  g.clear(color.Green)

  g.smoothingMode = smoothingMode.antiAlias


  g.drawString("看见了吗?", New font("黑体",16,fontstyle.bold),new SolidBrush(Color.White),New pointF(2,4))


  g.FillRectangle(New linearGradientBrush(New point(0,0), New point(120,30), color.fromArgb(0,0,0,0),color.fromArgb(255,255,255,255)),0,0,120,30)


  imgOutput.save(response.outputstream, imageformat.jpeg)


  g.dispose()

  imgOutput.dispose()

  response.end

  %>

  在以上代码中,我们看到和数据库程序不同,这里专门引入了图象处理的名字空间system.drawing等。程序首先清空了Response,确保没有输出;然后,程序建立了一个120乘30大的BMP图象,再在这个基础上建立一个新图象,建立图象以后,我们首先“画”出了字符串“看见了吗”,该字符串为16大粗黑体,颜色为白色,位置为(2,4);最后,我们实现渐变效果。

  以上举例很简单,但是如果和数据库结合,我们可以实现很多使用ASP可能不敢想的效果。


  二、读取和改变图象文件大小

  读取图片?直接使用HTML不就可以了?当然可以,我们这里只是提供一种选择和方法来实现这一功能,具体这一功能的使用,我们可能需要在实践中更多的学习。先来看程序源代码:

  <% ' import all relevant namespaces %>

  <%@ import namespace="System" %>

  <%@ import namespace="System.Drawing" %>

  <%@ import namespace="System.Drawing.Imaging" %>

  <%@ import namespace="System.IO" %>


  <script runat="server">

  Sub sendFile()

  dim g as System.Drawing.Image = System.Drawing.Image.FromFile(server.mappath(request("src")))

  dim thisFormat=g.rawformat

  dim imgOutput as New Bitmap(g, cint(request("width")), cint(request("height")))

  if thisformat.equals(system.drawing.imaging.imageformat.Gif) then

  response.contenttype="image/gif"

  else

  response.contenttype="image/jpeg"

  end if

  imgOutput.save(response.outputstream, thisformat)

  g.dispose()

  imgOutput.dispose()

  end sub


  Sub sendError()

  dim imgOutput as New bitmap(120, 120, pixelformat.format24bpprgb)

  dim g as graphics = graphics.fromimage(imgOutput)

  g.clear(color.yellow)

  g.drawString("错误!", New font("黑体",14,fontstyle.bold),systembrushes.windowtext, New pointF(2,2))

  response.contenttype="image/gif"

  imgOutput.save(response.outputstream, imageformat.gif)

  g.dispose()

  imgOutput.dispose()

  end sub

  </script>

  <%

  response.clear

  if request("src")="" or request("height")="" or request("width")="" then

  call sendError()

  else

  if file.exists(server.mappath(request("src"))) then

  call sendFile()

  else

  call sendError()

  end if

  end if

  response.end

  %>

  在以上的程序中,我们看到两个函数,一个是SendFile,这一函数主要功能为显示服务器上的图片,该图片的大小通过Width和Height设置,同时,程序会自动检测图片类型;另外一个是SendError,这一函数的主要功能为服务器上的图片文件不存在时,显示错误信息,这里很有趣,错误信息也是通过图片给出的(如图):


  以上的程序显示图片并且改变图片大小,现在,我们将这个程序进一步,显示图片并且保持图片的长宽比例,这样,和实际应用可能比较接近,特别是需要制作电子相册或者是图片网站的时候比较实用。我们先来看主要函数:

  Function NewthumbSize(currentwidth, currentheight)

  dim tempMultiplier as Double

  if currentheight > currentwidth then

  tempMultiplier = 200 / currentheight

  Else

  tempMultiplier = 200 / currentwidth

  end if

  dim NewSize as New Size(CInt(currentwidth * tempMultiplier), CInt(currentheight * tempMultiplier))

  return NewSize

  End Function

  以上程序是增加的一个函数NewthumbSize,该函数专门处理改变一会的图片大小,这个图片的长宽和原图片的长宽保持相同比例。其他部分请参考上文程序代码。


  三、画图特效

  如果只是将图片显示在网页上,这样未免显得简单。现在,我们来进一步感受ASP.NET的强大功能。我们将学习图象处理中常用的图象反转、图象切割、图象拉伸等技巧。

  先来看看程序效果:



  仔细看,我们可以找到各种图象处理效果。现在,我们来看看程序代码:

  <%@ Page Language="vb" Debug="True" %>

  <%@ import namespace="system.drawing" %>

  <%@ import namespace="system.drawing.imaging" %>

  <%@ import namespace="system.drawing.drawing2d" %>

  <%

  dim strFilename as string

  dim i as System.Drawing.Image

  strFilename = server.mappath("./chris-fsck.jpg")


  i = System.Drawing.Image.FromFile(strFilename)


  dim b as New system.drawing.bitmap(i.width, i.height, pixelformat.format24bpprgb)

  dim g as graphics = graphics.fromimage(b)


  g.clear(color.blue)


  '旋转图片

  i.RotateFlip(System.Drawing.RotateFlipType.Rotate90FlipX)

  g.drawimage(i,New point(0,0))

  i.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipY)


  g.RotateTransform(10)

  g.drawimage(i,New point(0,0))

  g.RotateTransform(10)

  g.drawimage(i,New point(20,20))

  g.RotateTransform(10)

  g.drawimage(i,New point(40,40))

  g.RotateTransform(10)

  g.drawimage(i,New point(40,40))

  g.RotateTransform(-40)

  g.RotateTransform(90)

  g.drawimage(i,New rectangle(100,-400,100,50),New rectangle(20,20,i.width-20,i.height-20),GraphicsUnit.Pixel)

  g.RotateTransform(-90)


  ' 拉伸图片

  g.drawimage(i,New rectangle(10,10,50,50),New rectangle(20,20,i.width-20,i.height-20),GraphicsUnit.Pixel)

  g.drawimage(i,New rectangle(50,10,90,50),New rectangle(20,20,i.width-20,i.height-20),GraphicsUnit.Pixel)

  g.drawimage(i,New rectangle(110,10,150,50),New rectangle(20,20,i.width-20,i.height-20),GraphicsUnit.Pixel)



  '切割图片

  g.drawimage(i,50,100,New rectangle(180,80,60,110),GraphicsUnit.Pixel)

  g.drawimage(i,140,100,New rectangle(180,80,60,110),GraphicsUnit.Pixel)


  '旋转图片

  i.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipX)

  g.drawimage(i,230,100,New rectangle(180,110,60,110),GraphicsUnit.Pixel)


  response.contenttype="image/jpeg"


  b.save(response.outputstream, imageformat.jpeg)


  b.dispose()


  %>

  在以上的程序中,我们看到实现图象处理的各种技巧,仔细观察,我们可以知道旋转图片其实是用了一个RotateFlip方法;而切割和拉伸图片,完全是通过设置DrawImage的不同参数来实现。


  四、总结

  ASP.NET的图象处理可以实现的功能很多,我们在这里其实只是简单的介绍,更多功能的应用,需要我们在实践中摸索、总结。


我们在做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="登录" /></td><td>    <asp:Button ID="Button2" runat="server" Text="取消" CausesValidation=false /></td></tr> </table> </div>
布局如图:
ASP.NET中图象处理过程详解和三类经典案例让您一步就学会了 b2b软件
然后再新建一个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="上传图片"    /></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中图象处理过程详解和三类经典案例让您一步就学会了 b2b软件
三、生成略缩图
现在的很多博客、个人主页、空间之类的都有编辑个人信息的设置,在编辑个人信息的时候都可能会需要上传头像,下面我们来讲一下如何生成略缩头像。
页面布局的话我们还是引用上边的布局:
但是要在<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中图象处理过程详解和三类经典案例让您一步就学会了 b2b软件
为了方便大家的使用我已经把图片缩放功能封装成了一个类,里边还有其他的一些缩放的功能,已经导出了类模板,有兴趣的朋友可以点击下载ImageCut.zip,希望可以给大家一些帮助。


作者: 武器    时间: 2017-5-13 19:33
,样子不错,厂家给力
作者: 123    时间: 2017-5-15 15:57
很好用,店家手把手教真好
作者: pwl2015    时间: 2017-5-16 13:01
,老板人真心不错,给我便宜了许多
作者: lnzhanghao    时间: 2017-5-24 21:57
家人不错值得购买超赞
作者: iiiiik    时间: 2017-5-26 15:01
效率,好评!!!!
作者: huangge    时间: 2017-5-26 22:57
抱歉暑期太忙,都没时间上淘宝,公众号也没空做,系统已好评。其实应该打全五星的,很满意,就是传图片和编辑方面能更简化些就更好了。。。
作者: anleey    时间: 2017-6-1 15:56
特别满意,很细心很周到的为我司考虑设计方案,耐心的一点点修改。我之前的网站就是077号做的,这次添加搜索栏也是找的她以后还要找她~
作者: jh134724    时间: 2017-6-2 05:44
服务确实到位,基本是随叫随到!谢谢客服小笨蛋和技术人员15号笨蛋,虽然中间有一些耽搁了时间,总的来说完成的很满意,下次肯定还要来这家做!
作者: dongwuhua    时间: 2017-6-10 14:53
卖家,好评




欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://www.postbbs.com/) Powered by Discuz! X3.2