前段时间做了一个所见即所得的图形软件(可惜代码在公司不能带出来,就不能共享了),期间写了一个小小的总结,贴在这也算个记录吧。
-----------------------------------------------------------------------------------------
图形文件大致分成2种:矢量图,位图。
矢量图的特征是不管怎么放大,图形依然很清晰,因为本质上矢量图记录的是画图的命令序列;位图在放大的时候会变模糊,因为位图是点(象素)的集合。
图形编程和一般编程相差较大的就是特别考虑效率,及时释放资源,因为画图占用资源比较大。而且如果是直接画到屏幕上,因为每次刷新都会重画,资源占用大。
画图最主要的是得到Graphics对象(GDI+,C#),基本上任何图形对象都可以产生Graphics,可以把它看成是一个画板或者画东西的表面,就像生活中的一面墙,一个桌子等,得到这个表面之后,就可以在这个上面画出你想要的东西了。至于画板或者表面也多大,就要看产生该Graphics的对象的大小或者要设定。整个画图区域在一个二维坐标系下,用Graphics画图的时候可不管能画的区域有多大,它接收的参数包括画的位置,不管这个位置是否真的有意义,它就往上面画。画图本质上就是一些点,线的集合。一般会提供一些标准函数,然后就自己组合这些函数。
在画位图的时候,直接创建Graphics,然后在上面画,最后保存就行了(如果是画在屏幕上,就不用保存了,它会直接显示)。但是画矢量图的时候就要稍微复杂一点。因为它本质上是画图命令序列,所以需要先创建一个metaFile,再由这个元文件关联(或者创建)一个Graphics,然后再画图,最后保存。
典型的画位图和矢量图文件的方法如下:
1.位图:
Bitmap bp = new Bitmap(100,80); //100,80是设置画图区域的大小,如果不指定文件名,则默认在内存中创建
Graphics gs = Graphics.FromImage(bp); //从bp中获得Graphics对象
DrawImage(gs); //具体的画图步骤
bp.Save(fileName,ImageFormat.Bmp); //保存到文件中,保存的时候按指定格式保存到指定的文件中。ImageFormat是一个枚举的类型。
Graphics gs = Graphics.FromImage(bp); //从bp中获得Graphics对象
DrawImage(gs); //具体的画图步骤
bp.Save(fileName,ImageFormat.Bmp); //保存到文件中,保存的时候按指定格式保存到指定的文件中。ImageFormat是一个枚举的类型。
2.矢量图:
//100,80是设置画图区域的大小(对矢量图来说,这个大小设置没有意义,如果之后都不设定区域大小,那么它会根据图片的实际大小自动调整画出来的图片的大小),在内存中创建
Bitmap bp = new Bitmap(100,80);
Graphics gs = Graphics.FromImage(bp); //从bp中获得Graphics对象
Metafile mf = new Metafile(emfilename,gs.GetHdc(),rect,MetafileFrameUnit.Pixel); //矢量图必须有一个关联的元文件,rect指定画图区域的大小,这个才是真正的控制画图(更确切的说是保存的我们能看到的显示区域),在后面必须跟上区域大小的单位。
Graphics g = Graphics.FromImage(mf); //由元文件关联一个Graphics,这就表明以后用这个Graphics画图就画到metafile里面。
DrawImage(g); //具体的画图步骤
g.Dispose(); //释放资源,在释放的同时会保存。也可以调用g.Save();
mf.Dispose(); //释放资源
mf.Dispose(); //释放资源