GDI+技术论文

2024-07-26

GDI+技术论文(精选8篇)

GDI+技术论文 第1篇

关键词:图形设备接口扩展(GDI+),图元文件,特殊统计图,3D饼图

1. 引言

统计图是将统计表图形化,是用点、线、面等形状的位置与大小来形象地表达数据资料的各个方面。统计图把数据资料所反映的数量多少、变化趋势、相互关系和分布形态等直观地表现出来,方便读者阅读、分析和比较。在一些应用系统的开发中,往往会有大量的数据资料需要用统计图的方式表达。基本的统计图有折线图、圆饼图、柱状图、条形图、直方图及散点图等。本文中使用C#语言结合GDI+(Graphics Device Interface Plus)类库来设计实现高质量特殊统计图。

2. GDI+的特点

GDI+全称图形设备接口扩展,是Windows XP操作系统及以后版本的一个子系统,与GDI一样,主要负责对显示器和打印机进行管理[1]。GDI+的主要功能有矢量图形(图元文件)输出、光栅图形(位图)输出和文字或文本排版等。GDI+在GDI的基础上提供了非常显著的改进,特点有以下几个方面:支持样条曲线、画刷有渐变功能、可伸缩区域(Scalable Regions)、含独立的路径对象(Path Object)、转换对象和矩阵对象(Transformations&Matrix Object)、透明(Alpha)通道合成运算和多种格式图片支持等。

GDI+独立于具体的设备细节也即与设备无关,只需调用GDI+类库输出的一些方法实例即可完成对图形的具体操作,其真正的绘图工作交由驱动程序来支配物理设备完成。整个体系结构如图1所示。

3. 图元文件格式

在本文中用到的一种矢量图形文件叫图元文件,是由GDI+提供的Metafile类来记录和显示的。图元文件是一种由代码控制储存绘图指令和设定序列的图片[2]。Metafile对象中所记录的指令和设定可储存于内存、文件或数据流。在Windows系统中,图元文件格式主要有WMF、EMF和EMF+三种,扩展名各为wmf和emf(EMF和EMF+为同样的扩展名),区别如下:WMF是16位图元文件格式,可同时包含矢量信息和光栅图(位图)信息,它主要针对Windows系统进行了优化;EMF是32位格式,也可以同时包含矢量信息和光栅图(位图)信息,此格式是对WMF格式的改进,包含了一些WMF格式所没有的扩展功能,例如:内置的缩放比例信息数据,与文件一起保存的内置说明数据,调色板和设备独立性方面等的改进;而EMF+则是对EMF格式的扩展,主要是用来存储GDI+指令记录集。GDI+能够用EMF和EMF+格式记录图元文件,但不能使用WMF格式。图元文件格式作为一种矢量文件格式,其具有文件较短小、图案形状化的特点,整个图形一般由各个独立的组成部分拼接而成,还具有存储空间比较小、图形经放大或缩小后不会失真(光栅图除外)的优点,且与设备无关。程序输出此种文件后可直接被Illustrator、Corel Draw等矢量图形设计软件打开并编辑。

4. C#绘图原理

在.NET框架内,GDI+被包装在基类System.Drawing中,在使用C#语言绘图时只需要调用System.Drawing.Graphics的实例。在本文讨论的GDI+图形应用程序开发中基本需要用到如下6个的基类:(1)System.Drawing//包含基本绘图功能有关的大多数类,枚举,结构和委托;(2)System.Drawing.Drawing2D//为多数高级2D图形和矢量绘图操作提供了支持,包括消除锯齿(提高图形质量),几何转换和图形路径;(3)System.Drawing.Imaging//帮助处理图像文件的各种类,如光栅图(位图),矢量图(WMF、EMF)文件等;(4)System.Drawing.Printing//把打印机或打印预览窗口作为输出设备时使用的类;(5)System.Drawing.Design//一些预先定义的对话框,属性数据表和其它各种用户界面元素等,与在设计期扩展的用户界面相关;(6)System.Drawing.Text//对字体和字体系列执行更加高级的操作的类。

在C#的编程术语中,当程序创建一个窗口后,并在此窗口内执行一系列绘图操作指令时,一般需要首先声明一个派生于System.Windows.Forms.From的类。在这种情况下都会重写虚拟函数On Paint(),如果程序窗口内的任何一个部分内容需要重新绘制,操作系统都会调用这个函数,此函数中的Paint Event Args类是一个参数。在Paint Event Args中有两个非常重要的对象:Graphics对象与Clip Rectangle对象。在C#语言开发中要获得Graphics对象一般有三种不同的方法:第一个方法是重写On Paint()事件,从此事件的Paint Event Args中获得Graphics对象;第二个方法是在程序内直接在窗口或控件上调用this.Create Graphics()方法就可以获得Graphics对象(this是当前窗口或控件);第三个方法是通过图像对象创建一个Graphics对象,而在本文中就使用了此方法。三种方法如以下代码所示:

方法一:

方法二:

方法三:

Graphics g=Graphics.From Image(image);//注:image是一个图元或图像对象

5. 特殊统计图设计方法

在C#中,如果需要输出图元文件,必须在绘制图形前先建立一个Metafile实例,并在建立Metafile实例时将图元文件名和图元文件的存放位置作为参数传递给Metafile构造函数。再在该Metafile对象用Graphics.From Image(metafile)函数获取Graphics对象,在该图形对象上用代码绘制图形并保存,图形就保存为指定的图元矢量格式Emf图形。详细步骤如下:第一,要先定义一个EMF文件存放的文件名和文件位置的字符串;第二,要定义一个Bitmap即图片的内存大小;第三,用已定义的Bitmap获取一个Graphics;第四,用已定义的Graphics和文件名与位置获取一个Metafile即图元类对象;第五,再从Metafile定义来获取一个Graphics对象,图形的所有操作都在此Graphics对象上。代码如下:

string file Path=@"C:s1.emf";//在C盘的根目录输出图元文件s1.emf

Bitmap bmp=new Bitmap(320,240);//在内存中创建一个图片对象并指定图片大小

Graphics gs=Graphics.From Image(bmp);//获取一个Graphics对象

Metafile mf=new Metafile(file Path,gs.Get Hdc());//结合file Path和gs创建一个Metafile对象

Graphics g=Graphics.From Image(mf);//再获取一个Graphics对象

g.Smoothing Mode=Smoothing Mode.High Quality;//图形光滑绘制设置,以提高图形质量

g.Interpolation Mode=Interpolation Mode.High;//提高图形的缩放质量

g.Text Rendering Hint=Text Rendering Hint.Anti Alias;//提高文字输出质量

…//画图过程的代码

g.Save();//按file Path的指定保存图元矢量图

g.Dispose();//释放资源

mf.Dispose();//释放资源

在如上所示的代码内有一个省略的画图过程,在这个过程中来实现一个特殊图。在本文中以绘制一个3D饼图为例。3D饼图根据图上的扇区大小来表示数据的多少,表现方式直观,而且又不失美观。有一些软件如微软的Word、Excel等可以轻松绘制一个3D饼图,如图2所示,虽然此图实现了3D形状,但图形质量不高,线条不圆滑,锯齿非常明显。而经过本文介绍的方法所实现的3D图形,图形质量明显有不少的提高,已基本看不出线条的锯齿,如图3所示。

分析图2或图3,可以看到3D饼图表面是一个由若干扇区组成的椭圆图形,而正前方是由若干弧面组成的柱形。本文的在绘制3D饼图时的采用的思路是先绘制表面的椭圆,再绘制正前方的柱形,以组成一个完整的3D饼图。绘制3D饼图的基本步骤与方法如下:

先分析程序窗口上的坐标系统,如图4所示。

在图4中a是椭圆的长轴,b是椭圆的短轴,h是圆柱的高,A是椭圆上一个扇区的角度,此角度是根据数据用公式A’=Data*360/Data Sum计算出的值再经调整后的角度,因为用此公式计算出的值是圆的角度而不是椭圆的角度,所示需要调整后才能用在椭圆上,调整方法如下:

在得到正确的A值后经椭圆公式r=(a*b)/sqrt(cos(A)*cos(A)*b*b+sin(A)*sin(A)*a*a)便可计算出A角度端点(x,y)坐标(图4中的x、y值),方法如下(rect是Rectange类的实例,包含了椭圆初始坐标与长短轴值):

得到(x,y)值,便可在程序中用路径函数绘制出圆柱正前方的弧面。需要注意的是,此圆柱只需要绘制正前方,后面被椭圆遮住的内容是不需要绘制的,可以用角度A进行判断,如果在0o和180o之间,便需要绘制,否则不用绘制。绘制后的最终效果如图4所示。

6. 结论

本文中介绍的设计与实现方法,利用了.NET平台的C#语言和GDI+类库接口的技术特点,在已经有的研究(文献[3])基础上,向灵活应用技术的层面更前进了一步,既能灵活编辑图形的属性数据,也能灵活编辑图形的风格,还具备了可扩展的接口,也可重复用于各种图形报表应用软件的开发与研究。本文利用此方法实现的一系列特殊统计图并输出的图元文件,得到了非常美观且实用的图形效果。GDI+因其丰富的图形处理能力和灵活的代码运用表现力,使得其在图形处理程序开发中具有非常强大的优势。

参考文献

[1]秦佐,周晓光,刘军生,周辉.基于GDI+的复杂线状符号优化算法[J].测绘科学,2011,36(04):121-122.

[2]杨浩,张哲峰.GDI+程序设计[M].北京:清华大学出版社,2002.

GDI+技术论文 第2篇

在当Windows Vista提示“内存不足”,我们介绍过出现这种情况多是因为默认的Desktop Heap区间被占满所致,并给出将desktop heap区大小从默认的3072KB提高到需要数值的办法。不过,许多朋友依步骤进行调整后发现,仍然没有从根本上解决这一问题,上述的故障仍然时不时地再次出现,那么,问题出在哪儿?

其实,在Windows NT 家族系统中,除了desktop heap区的限制外,默认的用户句柄(User Handle)与GDI 句柄(GDI Handle)限制同样是引发上述故障的原因之一,特别是考虑到之前系统物理内存普遍较少的客观情况,默认的用户句柄与GDI 句柄数量也成为Windows 阻止同时打开更多程序/窗口的另一个主要原因。

解决方案很简单,那便是将默认的用户句柄与GDI 句柄数量修改为较大的数值。

提高Windows默认的默认的用户句柄与GDI 句柄数量

在Windows Vista开始菜单的搜索框中输入“regedit”,按回车;

注册表编辑将会触发UAC而弹出提示窗口,点击确认继续;

按当Windows Vista提示“内存不足”介绍的方法,首先将desktop heap区的大小从默认的3072KB提高,检查问题是否解决,如没有解决,再尝试以下的步骤;

找到如下注册表分支:

HKEY_LOCAL_MACHINE

C SOFTWARE

C C Microsoft

C C C Windows NT

C C C C CurrentVersion

C C C C C Windows

在右侧窗格中可以看到名为“GDIProcessHandleQuota”与“USERProcessHandleQuota”的注册表项;

GDIProcessHandleQuota项设置GDI句柄数量,默认值为2710(16进制)/10000(10进制),该值的允许范围为 256 ~ 16384 ,将其调整为大于默认的10000的值,

如果您的系统配置了2G或更多内容,不妨将其设置为允许的最大值 16384(10进制);

USERProcessHandleQuota项设置用户句柄数量,默认值同样为2710(16进制)/10000(10进制),该值的允许范围为 200 ~ 18000 ,将其调整为更多的数值。同样地,对于具有2GB或更多物理内存的系统,不妨将用户句柄数直接设置为上限 18000(10进制);

需要强调的是,修改“GDIProcessHandleQuota”与“USERProcessHandleQuota”值时,不要超过其接受的上限,不然,将导致Windows 无法工作或运行不稳定。另一方面,即使您的调整其超过其允许的上限,如果发现修改后Windows出现不稳定的症状,便需要将相应的数值调低些,或者恢复默认值。

注:

本技巧适用于Windows 2000、 Windows XP、 Windows Server 2003、Windows Vista;

GDI+技术论文 第3篇

雷达PPI显示器是雷达的重要组成部分, 它为操作人员提供雷达探测到空情信息。对雷达PPI显示器的通常采用Direct3D和Open GL技术来进行仿真, 其存在开发流程复杂, 效率较低, 成本高的缺点。本文介绍了GDI与双缓冲技术相结合的思路, 提出了一种新的PPI显示器的仿真方法。

1 双缓冲绘图的实现

双缓冲在内存中创建一个与屏幕绘图区域一致的对象, 先将图形绘制到内存中的这个对象上, 再一次性将这个对象上的图形拷贝到屏幕上, 这样能大大加快绘图的速度。Win32环境下双缓冲实现的首先, 在内存中创建与画布一致的双缓冲区;然后, 在双缓冲区画图;其次, 双缓冲区图像复制到显示缓冲区;最后, 释放内存缓冲区。其流程如图1所示。

2 雷达PPI显示器仿真模型的设计

在雷达PPI显示器仿真时, 详细分析了PPI显示器所要显示信息内容, 在利用GDI绘图进行了分层绘制, 将信息内容清晰的显示了出来, 避免了相互遮隐。将雷达PPI显示器界面显示划分为四层, 如图2所示。第一层为雷达背景、方位角刻度、底图等的模拟显示;第二层为距离刻度制层, 该层主要用来显示雷达距离环, 显示目标概率距离。第三层为扫描线的绘制层, 从数据区实时获取扫描线的动态数据, 在雷达显示器上绘制扫描线方位;第四层为文字信息层, 将雷达的状态、目标的标号等文字信息绘制出来。

3 PPI显示器的仿真实现

利用坐标变换后, 将PPI显示器360度划分6000mil, 长刻度每100mil绘制一次, 短刻度每50mil绘制一次, 其主要实现代码及算法如下:

4 结论

本文在研究雷达PPI显示器的仿真的基础上, 利用了GDI和双缓冲技术解决了PPI显示在仿真过程绘图复杂以及频繁更新画面过程的图像闪烁问题, 使PPI显示器仿真画面清晰逼真, 取得较好的效果, 为雷达显示器的仿真提供一种新的方法。

参考文献

[1]周涛.ZHOU Tao基于GDI+与双缓冲的飞机姿态指示仪 (ADI) 仿真实现[J].现代电子技术, 2014 (16) .

[2]周鸣扬, 赵景亮.精通GDI+编程[M].北京:清华大学出版社, 2003.

[3][美]李普曼, [美]拉茹瓦, [美]穆.C++Primer中文版[M].李师贤, 译.4版.北京:人民邮电出版社, 2006.

GDI+和GDI绘图性能对比实验 第4篇

下面这段是GDI实现图形显示的代码:

经过实验, 使用GDI技术在657*657的分辨率下, 每次绘制711条线, 每秒可以绘制180-260帧画面。

使用GDI+的方式采用了完全相同的算法和线的数量, 代码如下所示:

经过实验, 同样在657*657的分辨率下, 使用GDI+技术没帧绘制711条线, 每秒只能绘制5-11帧画面, 性能只有GDI的1/44, 性能差距之巨大是实验前作者没有想到的。

做上述实验使用的计算机配置如下:

2D技术在DirectX 7.0之后就不再继续发展了, 后续之所以还有小幅性能提升是因为硬件频率的提升, 包括CPU, 内存和显卡。GDI+技术根据实验来看已经完全无法承受动态图像显示的性能要求, 即使对实时性没有要求的情况下, 显示的流畅性也很差, 只能显示静态画面。当今计算机的显示器尺寸越来越大, 分辨率也越做越高, 即使是GDI在低分辨率下具有一定性能, 高分辨率下的性能也很差。

利用GDI函数减轻图像缩放失真 第5篇

图像显示是人们感知图像信息的最直观方式之一。文献[1]介绍了如何在VC++环境下设计一个位图浏览器进行多幅图像显示。由于图像大小与图像显示设备分辨率大小往往不一致, 为了在显示设备上更好地浏览图像, 往往需要将图像缩放到适合于显示设备分辨率大小的尺寸。在VC++中, 实现图像缩放显示的方法主要有两大类: (1) 根据图像几何变换公式, 运用插值方法生成缩放后的图像[2]; (2) 直接利用VC++提供的函数实现图像缩放。第一类方法需要清晰理解图像的几何变换关系及插值计算方法, 优点是可以根据图像质量要求设计各种缩放方法 (最邻近方法、双线性插值、样条插值等) , 适合于研究算法用。第二类方法编程简单, 代码效率高, 更适合于实际工程应用。VC++中提供的函数StretchDIBits或BitBlt, 可实现图像按任意比例大小缩放, 然而图像缩放后会出现明显的视觉失真, 其中图像缩小时尤为明显。针对这一不足, 运用图形设备接口 (GDI) 函数实现图像平滑缩放, 视觉效果优于直接运用函数StretchDIBits或BitBlt。

2步骤

减轻图像缩放失真的思路是专门分配一块内存单元储存缩放后的图像数据, 在显示图像阶段, 采用显示单元的数据进行位图绘制, 而不使用原来的位图数据。利用GDI函数实现缩放的主要步骤包括: (1) 计算缩放后的图像大小; (2) 根据缩放大小, 为显示单元分配内存空间; (3) 创建用于说明显示单元的位图信息头; (4) 利用CreateDIBSection分别创建图像缩放前后的设备无关位图 (DIB) ; (5) 将缩放前后的DIB载入上下文设备; (6) 设置上下文设备的图像伸缩模式; (7) 运用StretchBlt将源图像对应的DIB拷贝到缩放后的DIB; (8) 释放内存资源。

3函数说明

为了便于读者理解, 先介绍后续使用到的几个GDI函数。

(1) HBITMAP CreateDIBSection

HDC hdc, CONST BITMAPINFO*pbmi, UINT iUsage VOID*ppvBits, HANDLE hSection, DWORD dwOffset

hdc为上下文设备句柄, pbmi为BITMAPINFO类型的结构指针, iUsage指明使用的颜色类型:RGB颜色 (DIB_RGB_COLORS) 或调色板索引 (DIB_PAL_COLORS) , ppvBits存放位图图像位值的地址, hSection为可选的文件映射对象的句柄, dwOffset表示文件映射对象中位图位值的偏移量。该函数用于创建可直接写入的DIB, 执行成功时返回DIB位图句柄, 失败则返回NULL。

(2) HDC CreateCompatibleDC (HDC hdc)

该函数用于创建一个与上下文设备句柄hdc兼容的显示句柄, 执行成功返回内存句柄, 失败返回NULL。

(3) HGDIOBJ SelectObject

HDC hdc, HGDIOBJ hgdiobj

hgdiobj为对象句柄, 该函数用于将对象hgdiobj载入指定的上下文设备hdc, 执行成功返回被替换的对象句柄, 失败则返回NULL。

(4) int SetStretchBltMode

HDC hdc, int iStretchMode

iStretchMode为位图伸缩模式, 函数用于指明上下文设备句柄hdc进行图像缩放时采用的模式。如果执行成功, 返回上一次图像缩放采用的模式, 失败返回0。

(5) BOOL StretchBlt

HDC hdcDest, int nXOriginDest, int nYOriginDest, in nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, in nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop

hdcDest为目标上下文设备句柄, (nXOriginDest, nYOriginDest) 为目标矩形区的左上角坐标, nWidthDest和nHeightDest分别为目标矩形区域的宽度和高度, hdcSrc为源上下文设备句柄, (nXOriginSrc, nYOriginSrc) 为源矩形区的左上角坐标, 而nWidthSrc和nHeightSrc分别为源矩形区域的宽和高, dwRop代表光栅操作类型。该函数用于将源矩形区域的位图拷贝到目标区域, 它通过拉伸或压缩的方式使源位图能填充满目标区域。

(6) int StretchDIBits

HDC hdc, int XDest, int YDest, int nDestWidth, int nDestHeight, int XSrc, int YSrc, int nSrcWidth, int nSrcHeight, CONST VOID*lpBits, CONST BITMAPINFO*lpBitsInfo, UINT iUsage, DWORD dwRop

hdc为上下文设备句柄; (XDest, YDest) 为目标矩形区域的左上角坐标;nDestWidth和nDestHeight分别为目标矩形区的宽度和高度; (XSrc, YSrc) 为源矩形的左上角坐标;nSrcWidth和nSrcHeight分别为源矩形的宽和高;lpBits为存放位图图像位值的地址;lpBitsInfo为BITMAPINFO类型的结构指针;iUsage指明使用的颜色类型;dwRop代表光栅操作类型。该函数的功能是从设备无关位图 (lpBits指明) 中指明的矩形区域拷贝颜色数据到目标矩形区域。如果目标矩形比源矩形大, 函数将对颜色数据的行和列进行拉伸, 以匹配目标矩形;如果目标矩形比源矩形小, 则通过使用指定的光栅操作对行列进行压缩。

4缩放函数及BMP类

为了说明缩放函数的具体用法, 设计了一个名为CMyBitmap的BMP类, 将缩放函数Zoom作为BMP类的一个成员函数, 同时, 应用Zoom函数实现位图的缩放显示。CMyBitmap的类声明如下:

上述声明中的Zoom (double scale) 函数为图像平滑缩放函数, scale为伸缩比例, 执行成功返回true, 失败返回false, 具体定义如下:

函数BOOL Draw (CDC*pDC, bool m_gdi_draw=true, int nX=0, int nY=0, int nWidth=-1, int nHeight=-1) 实现位图显示。为了说明利用GDI函数设计的图像缩放函数优于直接使用StretchDIBits, Draw函数实现了两种图像缩放显示方式, 如果m_gdi_draw为true, 表示采用GDI设计的缩放函数显示;如果为false, 则表示直接使用StretchDIBits显示。参数中的 (nX, nY) 表示绘制位图的开始位置偏离屏幕左上角的距离, nWidth和nHeight分别表示图像显示的宽度和高度, 函数的具体代码如下:

5实例设计

利用Visual C++6.0开发工具设计一个基于多文档框架的位图浏览器, 实现位图的放大和缩小, 以说明缩放函数是有效实用的, 具体步骤如下。

5.1建立多文档框架应用程序

启动VC++后, 新建一个“MFC AppWizard (exe) ”类型的项目, 名为BmpScale。在MFC AppWizard的第一步, 选择“Multiple documents”, 在最后一步, 视图类的类基选择具有滚动条的“CScrollView”。在默认情况下, 启动多文档应用程序时将自动新建一个文档, 可通过在CBmpScaleApp的InitInstance () 函数中加入代码“cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing”将该功能屏蔽, 该代码应在ParseCommandLine (cmdInfo) 之后。同时, 在上述代码后面加入以下程序“m_nCmdShow=SW_SHOWMAXIMIZED”使应用程序启动时最大化窗口显示。字符串资源“IDR_BMPSCATYPE”声明了与应用程序关联的文件类型, 将其修改为“nBMPnBMPnBMP (*.bmp) n.bmpnBMP.DocumentnBMP Document”, 说明当前关联文件是后缀名为.bmp的位图。

5.2在文档类CBmpScaleDoc载入位图

首先在CBmpScaleDoc类声明两个共有变量用于表示位图实例及缩放比例:

5.3为视图类CBmpScaleView添加位图显示代码

先在CBmpScaleView中声明以下变量:

5.4控制位图显示方式

为菜单资源“IDR_BMPSCATYPE”下面的“查看”增加一个名为“GDI方式显示”的菜单项, ID名为ID_VIEW_GDI。在CBmpScaleView中, 为ID_VIEW_GDI映射消息函数OnViewGdi和OnUpdateViewGdi, 对应代码如下:

5.5添加位图缩放操作菜单

在菜单资源“IDR_BMPSCATYPE”下面的“查看”分别增加3个菜单项:“原图大小”、“缩小图像”和“放大图像”, 对应的ID名为“ID_VIEW_ORIGINAL”、“ID_VIEW_ZOOMO UT”和“ID_VIEW_ZOOMIN”。在CBmpScaleDoc中, 分别为这3个菜单项映射消息“COMMAND”, 其对应代码如下:

至此, 整个应用程序已经设计完毕, 编译项目并运行程序, 便可显示和缩放图像。利用应用程序打开测试图像“Peppers.bmp”, 单击菜单“查看”->“缩小图像”, 将得到缩小后的图像 (原图的75%大小) , 如图1 (a) 所示, 此时使用的是GDI方式显示。单击菜单“查看”->“GDI方式显示”, 将显示方式切换到直接利用StretchDIBits函数缩放显示, 得到如图1 (b) 所示的图像。对比两种显示方式缩小前后的图像发现, GDI方式显示的图像与原图像基本没有差异, 而直接使用StretchDIBits缩小图像时却出现明显视觉失真。由此可见, 利用GDI函数实现图像缩放的方式优于直接使用StretchDIBits缩放的方式。

6结语

图像缩放是图像处理中的一个基本操作。运用GDI函数设计了一个图像缩放函数, 利用该函数实现图像缩放可减轻直接使用StretchDIBits函数带来的视觉失真。文中将缩放函数作为BMP类的一个成员函数, 通过位图的缩放显示说明其有效可行, 由于JPEG、GIF、PNG、TIFF等格式的图像均有相应的位图对应, 对他们进行缩放处理和显示操作均可通过操作其对应位图实现, 因此文中设计的缩放函数也可以应用到这些格式的图像。

摘要:针对直接运用StretchDIBits函数进行图像缩放时的视觉失真问题, 利用GDI函数设计一个图像缩放函数, 使用该函数得到的视觉效果优于直接使用StretchDIBits。文中以位图缩放显示为例, 对如何使用该函数进行说明。

关键词:图像缩放,图像失真,GDI函数,位图,VC++

参考文献

[1]唐振军, 位图浏览器的设计.电脑编程技巧与维护, 2007, (3) :60-62.

GDI+技术论文 第6篇

GDI+为开发人员提供了简单易用的几何变换函数, 但并没有详细介绍实现这些变换的几何原理。而掌握这些原理, 对于创建复杂的几何变换却是十分必要的, 因此本文在下面内容中从图形学的角度深入的研究了这几种基本几何变换的实现原理。

2 几何变换的基础

GDI+中对矢量图形的变换是通过矩阵 (Matrix) 运算实现的。矩阵对象是GDI+中引入的用于描述几何变换过程的对象, 是一个封装的3 x 3仿射矩阵。其结构可以表示如下:

对矢量图形的变换, 在本质上是对矢量图形的控制点的变换。比如对一个多边形的变换, 实际是对该多边形的端点坐标的变换。因此, 可将矢量图形的几何变换问题, 转变为对点集的几何变换问题。

现假设平面上一点P的坐标为 (x, y) , 则对该点施加几何变换之后产生的点P’的坐标 (x’, y’) 可以按以下方式计算得出:

基中W称为“哑元坐标”, 作用仅是为了使坐标满足矩形乘法的形式, 并没有实际意义, 其值通常取1。适当控制变换矩阵M中各元素的值, 既可使x’, y’的值由原始值x, y按一定的运算规律生成, 从而达到坐标变换的目的。下面就平移、旋转、缩放三种变换形式分别讨论M的取值。

3 三种基本几何变换的原理

3.1 平移变换

假设平面上一点P (x, y) , 对P施加平移变换后得到新坐标P’ (x’, y’) , 以dx, dy分别表示P点在水平和垂直方向的坐标偏移量, 则有:

取平移变换对应的变换矩阵M为:

将此矩阵应用于变换程序中, 此处以C#语言为例, 以GDI+中的路径对象代表矢量信息, 关键代码如下:

Graphics Path p=new Graphics Path () ;//此处以路径对象代表矢量图形, 下同

3.2 旋转变换

假设平面上一点P (x, y) , 对P施加旋转变换后得到新坐标P’ (x’, y’) , 以α表示旋转角度, 则根据解析几何学有如下关系式:

取旋转变换对应的变换矩阵M为:

将此矩阵应用于变换程序中, 关键代码如下:

3.3 缩放变换

假设平面上一点P (x, y) , 对P施加缩放变换后得到新坐标P’ (x’, y’) , 以sx表示水平方向的缩放系数, sy表示垂直方向的缩放系数, 即:

取缩放变换对应的变换矩阵M为:

将此矩阵应用于变换程序中, 关键代码如下:

4 复合的几何变换原理

复合的几何变换可以由前面介绍的三种基本变换组合得到。例如希望对图形先进行平移变换, 再进行缩放变换, 可先用平移矩阵M1左乘原坐标矢量T= (x, y1, ) T, 再用缩放矩阵M2左乘T, 即T’ (x', y', W) T=M2×M1×T。此时, 可将变换矩阵M视为M2与M1的乘积, 即M=M2×M1。

关键代码如下:

但一定注意, 此处不能交换m1, m2的运算次序。不同的变换顺序, 变换结果可能截然不同。此处举例验证, 假设P点原坐标为 (1, 1) , 对其先在水平方向平移1个单位, 再在水平方向缩放2倍, 按照上面的计算方式其新坐标应为 (4, 1) ;但若先缩放2倍再平移一个单位, 则其坐标为 (3, 1) 。两次变换得到的结果是不同的, 其本质原因是因为交换律对于矩阵乘法不成立, 即M2×M1并不一定等于M1×M2。

在进行复合变换时, 不管进行多少次中间变换, 最终作用在原坐标上的变换矩阵只有一个, 就是这些个中间变换矩阵的连乘积。

参考文献

[1]周鸣扬, 赵景亮.《精通GDI+编程》2004.2

[2]徐歆恺梁博葛庆平.基于Windows GDI+的几何线条处理, 《计算机与信息技术》2005.5

GDI+技术论文 第7篇

发动机一直都是汽车研发的重中之重, 而在环保、经济、动力要求均日益提高的现代社会, 对发动机技术的要求也愈发增加。如今, 随着中国节能减排政策力度的加强, 突破能源环境瓶颈的需求更为迫切。同时, 汽车生产商都希望获得体积更小、能效更高的燃油发动机, 因此诞生于20世纪的GDI技术逐渐在中国市场受到了瞩目。

此次发布的Pressurfect和Pressurfect XP专为GDI汽车发动机量身定制, 高强度、耐腐蚀, 可保证燃料充分且安全地燃烧, 同时满足节能减排的需求。其中, Pressurfect XP强度更强、质量更轻 (减重可达40%) , 可轻松应对极端压力工作条件。在美国机动车工程师学会2014年会上, 该款产品被授予SAE技术奖, 彰显了山特维克勇于不断创新和突破的精神。

GDI+技术论文 第8篇

关键词:GDI+,测井曲线,图形对象,设计模式

国外的测井成像技术起步较早, 其中美国在测井成像领域拥有先进成熟的技术。随着计算机图形技术在各行各业的应用, 世界各地测井解释人员及计算机工作人员开始加强对测井成像的研究。

20世纪70年代初, 我国油田内部开始使用计算机技术进行测井数据的处理和分析。在此之后, 伴随着高性能计算机和图形技术的发展, 测井绘图系统相继推出。测井解释向着数据处理、结论解释、成果图形展示一体化方向发展。国内具有代表性的解释系统有:Forward地层油气层测井评价系统, Log Vision测井分析平台。

测井解释的发展虽然已有四十年的历史, 且多数测井解释平台已经使用面向对象进行开发, 但是在二次开发和复用时, 需要付出大量时间做重复性工作。软件重用中重要的组件很少用于测井解释平台软件。因此本次设计在实现测井曲线的同时, 结合改进的抽象工厂模式和组合模式部分内容, 封装绘图组件同时方便增加新的图形类型对象 (仪器串图、地层测试成果图等) , 使系统具有较好的可扩展性、灵活性和方便性, 同时达到复用的效果。

1 相关技术

1.1 GDI+

GDI (Graphics Device Interface, 图形设备接口) 的主要任务是负责系统与绘图程序之间的信息交换, 处理所有Windows程序的图形输出, 是Windows API (Application Programming Interface) 的一个重要组成部分, 是Windows图形显示程序与实际物理设备之间的桥梁。GDI使得用户不需要注重具体设备的细节, 只需要在一个虚拟环境 (逻辑设备) 中进行操作。实现了程序开发人员与硬件设备的隔离, 为开发工作提供了便利。

GDI+是对GDI改进的结果, 在GDI的基础上优化了原有的功能, 新添加了二维矢量图形的显示、图像处理和版式处理等诸多功能, 主要负责在显示屏幕和打印设备输出有关信息。GDI+类和接口是.NET框架的组成部分。通过使用GDI+, 可以创建图形、绘制文本以及将图形图像作为对象操作, 同时软件开发人员可以使用GDI+在Windows窗体和控件上方便地呈现自定义组合图形图像。

1.2 设计模式

抽象工厂设计模式, 提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们具体的类。具体工厂类在应用中只需要初始化一次, 改变具体工厂即可使用不同的产品配置。这个模式的主要结构如图1所示。

Abstract Product A和Abstract Product B是两个抽象产品, 它们都有可能有两种不同的实现, 而Product A1、Product A2和Product B1、Product B2就是两个抽象产品的具体分类的实现。Abstract Factory是一个抽象工厂接口, 它里面包含所有的产品创建的抽象方法, Concrete Factory1和Concrete Factory2是具体的工厂。通常是在运行时刻再创建一个Concrete Factory类的实例, 这个具体的工厂再创建具有特定实现的产品对象。

2 绘图设计

首先, 根据各种图形元素的共性创建一个抽象绘图父类 (Plot Object) , 定义绘图子类的公共属性和方法, 所有绘图子类都继承该父类。Plot Object类的示意代码如下:

然后, 创建一个改进了的工厂类 (Plot) , 所有图形对象都由它的创建函数进行创建, 输入图形类型, 返回绘图父类对象。如果使用抽象工厂方法, 则需要添加抽象道工厂类和抽象曲线工厂类, 当需求增加, 则在修改已定义的抽象类同时还要添加新的抽象对象工厂类。因此本文使用简单工厂来改进抽象工厂, 只使用一个抽象工厂类Plot。Plot类的示意代码如下:

客户端使用Plot Object类和Plot类创建绘图对象, 示意代码如下:

在客户端程序中, 定义绘图对象, 通过工厂类的创建函数, 传递对象类型, 生成不同的绘图对象。通过调用相同的接口函数实现不同的绘制方法。具体设计框图如图2所示。

客户端程序无需与具体图形类打交道, 只需知道父类与工厂类就能创建图形, 使系统的结构更加清晰, 层次更加分明, 有利于系统的开发与调试。如果要增加功能, 需要添加新的主要图形对象时, 客户端程序和父类接口都不需要做任何改动, 只需增加新的图形类, 在工厂类的创建对象函数中增加创建新类对象的代码即可, 使系统有较强的可扩展性。

用户可以在客户端对图形进行移动、改变大小、编辑属性等操作, 这些都是封装在类的内部实现, 用户直接调用接口方法, 从而无需了解其中的过程, 很好地实现了封装。

从图2可以看到, Track类和Curve类都是由不同的子元素构成, 这里提取了组合模式的概念, 对这两个类进行了组合。子元素只出现在父元素的内部, 因此在客户端所展示的只有父元素 (Track类和Curve类) , 这也使得客户端简洁易懂。同时子元素内部还有更细小的元素, 例如柜形框类 (PRectangle) , 直线类 (PLine) , 字体类 (PFont) , 文本类 (PString) 等绘图基本元素类。当增加一个新的绘图类时, 也可以直接使用这些绘图基本元素类, 达到重用的效果, 增加系统的灵活性。

3 系统实现

下面用两个简单的类来说明系统的实现过程。创建绘图对象的工厂类函数:

绘制图形道对象Track类, 继承Plot Object类:

系统实现效果如图3。

4 结束语

通过上述的设计方法, 可以更加灵活地实现测井曲线的绘制, 以及方便地对已绘制图形对象进行移动、调整大小、编辑属性等。同时能够满足图像操作的流畅性、易用性和灵活性, 通过改进的抽象工厂模式使绘图组件有更好的复用性。该文介绍的设计方法并不只局限于测井曲线的绘制, 用户可以根据具体需求自定义组合图形对象, 绘制属于自己的个性图形。

参考文献

[1]朱卫新.Visual C#.NET实现用户自定义图形编程方法[J].计算机技术与发展, 2011 (4) :130-312.

[2]刘昕.基于GDI+的绘图方法研究[J].硅谷, 2011 (15) :104-105.

[3]闫宇晗, 常鑫.在C#中用GDI+实现图形动态显示[J].计算机技术与发展, 2006 (12) :117-118.

上一篇:室内设计空间管理下一篇:民办银行发展前景