ASP.NET编程:基于.NET数字处置程序的框架计划
C#中有两处地方用到new关键字,第一处也是最常见的一处是用在调用构造函数的时候,这种情况也是大家见的最多的一种。另一处是用在派生类中,作用有隐藏成员,切断继承关系等,相信第二处的用法大家明显要比第一处生疏。程序|计划打仗数字图象处置最早是在高中,当时候PHOTOSHOP仍是4.0,多是由于先进为主的干系,到如今都没有学3DMAX之类的乐趣,2D到3D的奔腾估量是没我甚么事了,舍不得那平方到立方的高薪....呵呵。在上年夜学的时分,就和同砚一同写过一些图象处置的程序,谁人时分编程还很随便,思索的只是怎样完成,如今看来真实的手艺是掌控全局的才能,而不是灵光一现的奇妙。前些日子打仗了一些外洋的图象处置程序,在这里算是作个总结,估量今后不会再针对性的研讨图象处置方面的器材了。
之前的一个同砚已经跟我说过.net没有指针,如今良多培训课仿佛也是这么讲的,实在这是一个错误。只是framework不保举利用指针,特别是在webservise,remoting等跨历程操纵中,指针都是不平安的。但用过TC的列位都应当对指针的实行效力又深入的印象,在批量运算年夜范围数据的需求下,指针是不贰的选择。因此.net伶俐的保存的保存了指针,并将其列进不平安办法会合。公道的利用指针将年夜幅度进步实行效力,我曾做过实验,对640*480的图象举行逐点运算,非指针运算要实行数分钟,而指针运算几近是刹时完成的。以是不关键怕利用指针。
其次就是数学,劝告人人必定要弄分明了再写程序,数学课不是闹着玩的......想不分明就要躺在床上重复的想,我总以为数学能防备老年聪慧。
言回正传,说说程序布局吧:
Imaging项目(滤镜,纹理,图象形式)
Math项目(算法,界限,定制。及经常使用盘算办法)
主程序项目
各举个例子来讲明,我也来一回面向接口编程,
publicinterfaceIFilter
{
BitmapApply(Bitmapimg);
}
举例来讲明,我也来一回面向接口编程,各滤镜都要完成这个接口,接口界说还包含一个不天生实践图象,只天生二进制工具的托言界说,在这里暂不作思索。以取反色滤镜为例
publicBitmapApply(BitmapsrcImg)
{
//getsourceimagesize
intwidth=srcImg.Width;
intheight=srcImg.Height;
PixelFormatfmt=(srcImg.PixelFormat==PixelFormat.Format8bppIndexed)?
PixelFormat.Format8bppIndexed:PixelFormat.Format24bppRgb;
//locksourcebitmapdata
BitmapDatasrcData=srcImg.LockBits(
newRectangle(0,0,width,height),
ImageLockMode.ReadOnly,fmt);
//createnewimage
BitmapdstImg=(fmt==PixelFormat.Format8bppIndexed)?
AForge.Imaging.Image.CreateGrayscaleImage(width,height):
newBitmap(width,height,fmt);
//lockdestinationbitmapdata
BitmapDatadstData=dstImg.LockBits(
newRectangle(0,0,width,height),
ImageLockMode.ReadWrite,fmt);
//copyimage
Win32.memcpy(dstData.Scan0,srcData.Scan0,srcData.Stride*height);
//processthefilter
ProcessFilter(dstData,fmt);
//unlockbothimages
dstImg.UnlockBits(dstData);
srcImg.UnlockBits(srcData);
returndstImg;
}
是该滤镜办法的出口,完成了处置前的筹办事情,ProcessFilter同时挪用每一个滤镜类中共有的ProcessFilter办法,而这个ProcessFilter就是完成功效的关头地点了逐点运算或模版运算。
//Processthefilter
privateunsafevoidProcessFilter(BitmapDatadata,PixelFormatfmt)
{
intwidth=data.Width;
intheight=data.Height;
intlineSize=width*((fmt==PixelFormat.Format8bppIndexed)?1:3);
intoffset=data.Stride-lineSize;
//dothejob
byte*ptr=(byte*)data.Scan0.ToPointer();
//invert
for(inty=0;y<height;y++)
{
for(intx=0;x<lineSize;x++,ptr++)
{
//iverteachpixel
*ptr=(byte)(255-*ptr);
}
ptr+=offset;
}
}
个中Format8bppIndexed是不用太体贴的,团体以为计划早期能够不必思索兼容它的成绩。
上面来讲说纹理,这个之前思索得还不太多,但发明老外很喜好玩这个,由于纹理在数学方面发扬的空间更年夜,我也不晓得他们是怎样想出来的,平空想大概还真是有难度,多是他们谁在玩数学建模软件的时分发明这个弄法的,因而高数先生谁也不平谁,把算法玩的火火的。归正我以为是这么回事。。。
publicinterfaceITextureGenerator
{
/**////<summary>
///Generatetexture
///</summary>
float[,]Generate(intwidth,intheight);
/**////<summary>
///Reset-regenerateinternalrandomnumbers
///</summary>
voidReset();
}
这是纹理天生器的完成接口,为了包管每次的纹理分歧,还要更新随机数以作为盘算参数
privateMath.PerlinNoisenoise=newMath.PerlinNoise(1.0/32,0.05,0.5,8);
完成纹理细节还必要靠noise完成,因此必要完成很多种noise。
//Constructors
publicWoodTexture():this(12.0){}
publicWoodTexture(doublerings)
{
this.rings=rings;
Reset();
}
机关函数供应了默许值的设置,也就是对单元纹理巨细的限制。
//Generatetexture
publicfloat[,]Generate(intwidth,intheight)
{
float[,]texture=newfloat;
intw2=width/2;
inth2=height/2;
for(inty=0;y<height;y++)
{
for(intx=0;x<width;x++)
{
doublexv=(double)(x-w2)/width;
doubleyv=(double)(y-h2)/height;
texture=
Math.Max(0.0f,Math.Min(1.0f,(float)
Math.Abs(Math.Sin(
(Math.Sqrt(xv*xv+yv*yv)+noise.Function2D(x+r,y+r))
*Math.PI*2*rings
))
));
}
}
returntexture;
}
这就是。。。我数学欠好的了局。都不晓得她在说甚么呢,最小值当选出最年夜值。算法不难找,关头是要看布局怎样将他们整合起来。
publicvoidReset()
{
r=rand.Next(5000);
}别忘了这个随机数,数字的图象也必要天然的美。
Math工程中面向工具的看法不它简单失掉贯彻,看一看谁人PerlinNoise吧,举一反三。
publicPerlinNoise(doubleinitFrequency,doubleinitAmplitude,doublepersistance,intoctaves)
{
this.initFrequency=initFrequency;
this.initAmplitude=initAmplitude;
this.persistance=persistance;
this.octaves=octaves;
}
起首要搜集数据,由于图象处置要触及到一维和二维两种情形,因此像noise这类底层办法要分离对应着两种情形给出对应的办法。
/**////<summary>
///1-DPerlinnoisefunction
///</summary>
publicdoubleFunction(doublex)
{
doublefrequency=initFrequency;
doubleamplitude=initAmplitude;
doublesum=0;
//octaves
for(inti=0;i<octaves;i++)
{
sum+=SmoothedNoise(x*frequency)*amplitude;
frequency*=2;
amplitude*=persistance;
}
returnsum;
}
/**////<summary>
///2-DPerlinnoisefunction
///</summary>
publicdoubleFunction2D(doublex,doubley)
{
doublefrequency=initFrequency;
doubleamplitude=initAmplitude;
doublesum=0;
//octaves
for(inti=0;i<octaves;i++)
{
sum+=SmoothedNoise(x*frequency,y*frequency)*amplitude;
frequency*=2;
amplitude*=persistance;
}
returnsum;
}
一维跟二维的区分是甚么,上中学的时分晓得了线的活动天生了面,上年夜学又晓得了轮回着变更着的线能代外表,但假如做过了边沿辨认和锐化今后话,又发明之前小视线了,实在它只是比面少一个参数罢了。
/**////<summary>
///Ordinarynoisefunction
///</summary>
protecteddoubleNoise(intx)
{
intn=(x<<13)^x;
return(1.0-((n*(n*n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0);
}
protecteddoubleNoise(intx,inty)
{
intn=x+y*57;
n=(n<<13)^n;
return(1.0-((n*(n*n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0);
}又一次证实了后面那段话,团体感到这个x+y*57有点投影的意义。猎取响应的噪点值。但噪点不是间接就可以拿来用的
/**////<summary>
///Smoothednoise
///</summary>
protecteddoubleSmoothedNoise(doublex)
{
intxInt=(int)x;
doublexFrac=x-xInt;
returnCosineInterpolate(Noise(xInt),Noise(xInt+1),xFrac);
}
protecteddoubleSmoothedNoise(doublex,doubley)
{
intxInt=(int)x;
intyInt=(int)y;
doublexFrac=x-xInt;
doubleyFrac=y-yInt;
//getfournoisevalues
doublex0y0=Noise(xInt,yInt);
doublex1y0=Noise(xInt+1,yInt);
doublex0y1=Noise(xInt,yInt+1);
doublex1y1=Noise(xInt+1,yInt+1);
//xinterpolation
doublev1=CosineInterpolate(x0y0,x1y0,xFrac);
doublev2=CosineInterpolate(x0y1,x1y1,xFrac);
//yinterpolation
returnCosineInterpolate(v1,v2,yFrac);
}光滑的噪点,这个称号仿佛有点不和谐,经由过程余弦插值,而不是团圆余弦来运算。甚么是余弦插值呢?/**////<summary>
///Cosineinterpolation
///</summary>
protecteddoubleCosineInterpolate(doublex1,doublex2,doublea)
{
doublef=(1-Math.Cos(a*Math.PI))*0.5;
returnx1*(1-f)+x2*f;
}就是这个,有些事变,大家晓得就够了,你就照着往做就好了,为何?由于你大概一生也不分明,天然有人会往弄分明的,常识还在传承。就像你不用晓得本人的胃酸比例,也能够宁神的吃喷鼻喝辣一样,也不用忧虑子孙儿女消化不良。有些事变不用强求,有点悲观了,呵呵。
画面其实不难,只需掌控好挪用干系就能够了,别的像photoshop那样的悬浮窗体是最好的选择我以为,//Invertimage
privatevoidinvertColorFiltersItem_Click(objectsender,System.EventArgse)
{
ApplyFilter(newInvert());
}
//Applyfilterontheimage
privatevoidApplyFilter(IFilterfilter)
{
try
{
//setwaitcursor
this.Cursor=Cursors.WaitCursor;
//applyfiltertotheimage
BitmapnewImage=filter.Apply(image);
if(host.CreateNewDocumentOnChange)
{
//opennewimageinnewdocument
host.NewDocument(newImage);
}
else
{
if(host.RememberOnChange)
{
//backupcurrentimage
if(backup!=null)
backup.Dispose();
backup=image;
}
else
{
//releasecurrentimage
image.Dispose();
}
image=newImage;
//update
UpdateNewImage();
}
}
catch(ArgumentException)
{
MessageBox.Show("Selectedfiltercannotbeappliedtotheimage","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
finally
{
//restorecursor
this.Cursor=Cursors.Default;
}
}挪用顺畅的话,几代码都不会以为乱,关于初学者来讲,要善用region。
这里另有个DocumentsHost的观点,用它来承载图象文件,并将图象和窗体毗连起来,很便利/**////<summary>
///IDocumentsHostinterface
///Providesconnectionebetweendocumentsandthemainwidnow
///</summary>
publicinterfaceIDocumentsHost
{
boolCreateNewDocumentOnChange{get;}
boolRememberOnChange{get;}
boolNewDocument(Bitmapimage);
boolNewDocument(ComplexImageimage);
BitmapGetImage(objectsender,Stringtext,Sizesize,PixelFormatformat);
}
接待人人跟我会商
因为二次编译器太复杂,那么建议只是在安装程序的时候编译一次,而不类似java那样运行就编译。并且我觉得,一次痛苦,总比多次低效率要舒服多了。 ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。 当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。 ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。 弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。 asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源 由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。 现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。 主流网站开发语言之PHP:PHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。
页:
[1]