莫相离 发表于 2015-2-3 23:33:49

ASP编程:ASP.NET完成图像处置详解

asp,你就只能等着微软给你解决,它不乐意你就只好悲催。而且asp跑在windows服务器上,windows服务器跟linux比起来简直弱爆了!    在利用ASP的时分,咱们经常要借助第三方控件来完成一些图像功效。而如今,ASP.NET的推出,咱们已没有需要再利用第三方控件来完成,由于ASP.NET 已具有壮大的功效来完成一些图像处置。如今,咱们就来看看如何利用ASP.NET的这一壮大功效。

   1、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能够不敢想的后果。
2、读取和改动图像文件巨细

   读取图片?直接利用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,该函数专门处置改动一会的图片巨细,这个图片的长宽和原图片的长宽坚持不异比例。其他局部请参考上文法式代码。
3、绘图殊效

   假如只是将图片显示在网页上,如许不免显得复杂。如今,咱们来进一步感触感染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的分歧参数来完成。

   4、总结

   ASP.NET的图像处置可以完成的功效良多,咱们在这里其实只是复杂的引见,更多功效的使用,需求咱们在理论中探索、总结。
无法实现跨操作系统的应用。当然这也是微软的理由之一,只有这样才能发挥ASP最佳的能力。可是我却认为正是Windows限制了ASP,ASP的概念本就是为一个能让系统运行于一个大的多样化环境而设计的;

冷月葬花魂 发表于 2015-2-4 02:08:05

掌握asp的特性而且一定要知道为什么。

分手快乐 发表于 2015-2-4 13:30:10

他的语法和设计思路和VB完全相同,导致很多ASP的书都留一句“相关内容请参考VB的相关教材....”更糟糕的是,相当多的ASP教程混合了Javascript,VBscript等等脚本语言,搞的初学者。

乐观 发表于 2015-2-8 07:13:50

代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。

谁可相欹 发表于 2015-2-9 09:57:07

运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写,使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行。

精灵巫婆 发表于 2015-2-27 05:26:31

代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。

小魔女 发表于 2015-3-4 19:37:58

如何学好ASP,以前也有人问过,把回答给你转过来看看能否对你有帮助:

简单生活 发表于 2015-3-11 20:49:51

兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的

兰色精灵 发表于 2015-3-19 12:41:09

跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组

金色的骷髅 发表于 2015-3-24 05:21:08

Server:这个表示的服务器,操作服务器的一些东西使用这个,如Server.Mappath转换服务器路径,Server.CreateObject实例化一个组件

灵魂腐蚀 发表于 2015-4-6 19:10:00

还有如何才能在最短的时间内学完?我每天可以有效学习2小时,双休日4小时。

小妖女 发表于 2015-4-9 17:35:26

还有如何才能在最短的时间内学完?我每天可以有效学习2小时,双休日4小时。

小女巫 发表于 2015-4-11 00:10:23

我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标.

只想知道 发表于 2015-4-12 23:57:46

如何更好的使自己的东西看上去很不错等等。其实这些都不是问题的实质,我们可以在实践中不断提升自己,不断充实自己。

若相依 发表于 2015-4-16 18:12:30

如何更好的使自己的东西看上去很不错等等。其实这些都不是问题的实质,我们可以在实践中不断提升自己,不断充实自己。

老尸 发表于 2015-4-17 12:46:46

跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组

飘飘悠悠 发表于 2015-4-17 13:07:34

先学习用frontpage熟悉html编辑然后学习asp和vbscript建议买书进行系统学习

若天明 发表于 2015-4-18 01:09:11

他的语法和设计思路和VB完全相同,导致很多ASP的书都留一句“相关内容请参考VB的相关教材....”更糟糕的是,相当多的ASP教程混合了Javascript,VBscript等等脚本语言,搞的初学者。

山那边是海 发表于 2015-4-21 19:26:25

我就感觉到ASP和一些常用的数据库编程以及软件工程方面的思想是非常重要的。我现在也在尝试自己做网页,这其中就用到了ASP,我想它的作用是可想而知的。

柔情似水 发表于 2015-5-1 07:39:52

那么,ASP.Net有哪些改进呢?
页: [1]
查看完整版本: ASP编程:ASP.NET完成图像处置详解