1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。 基于GDI+的投影坐标与屏幕坐标的转换研究 摘要: 概述了GDI+技术以及其三种坐标系, 对于本文所要研究的投影坐标系、 屏幕坐标系进行了描叙以及在C#基础上研究了二者的转换。 关键词: GDI+技术、 坐标转换、 屏幕坐标、 投影坐标 Abstract: The GDI + technology and its three kinds of coordinates, for this paper to study the projection coordinate system, the screen coordinat
2、e system and in the c # of the Miao Xu studied on the basis of the two conversions. Keywords: GDI + technology, coordinate transformation, the screen coordinates, Projection Coordinates 一、 GDI+技术概述及GDI+中的坐标系 GDI( graphics device interface) 为图形设备接口, 是Windows提供给应用程序的编程接口, 使得编程人员不需要与显示器、 打印机等图形设备打
3、交道。GDI+是GDI的改进型, 它是基于类的应用程序编程接口。GDI+已包含在Windows XP和Windows.NET服务器操作系统中, 对在Windows.NE4.0 SP6,Windows , Windows98和Windows ME等操作系统中使用GDI+的用户需要下载GDI+的相关软件安装。GDI+这种新型的图形设备接口与GDI比较, 一方面增加了新的功能如梯度刷( gradient brushes) 和alpha blending等, 这些新的功能能够让用户创立全新的用户桌面体系, 能够轻易地完成二维或三维的图形处理, 为桌面带来一种数字化的图片; 另一方面修改了编程的模式,
4、新的模式使用起来更加方便、 实用性更强。 在GDI设备描述表( device context,DC) 包含了特定的显示设备的信息、 图像的显示属性及特定的显示窗口等信息, 用GDI编程的第一步必须获取当前的设备描述表的句柄( hDC) , 然后将该句柄作为参数调用GDI提供的API函数。在GDI+中, 获取设备描述表后创立Graphics对象并继承其方法, Graphics对象的作用与设备描述表相同, 但使用上有很大不同, 前者是基于句柄的技术, 而后者是基于面向对象的技术。Graphics对象是与特定的窗口信息相联系, 包含特定的图形显示信息, 可是它不与特定的笔( pen) 、 刷( b
5、rush) 、 图像( image) 和字体( font) 捆绑在一起。在GDI中, 要用笔画线必须用SelectObject函数将特 定的笔对象选进获取的设备描述表, 这被选的笔将用于后面画的所有的线; 在GDI+中, 笔、 刷、 图像和字体等对象是作为参数传递给Graphics对象的方法。 在GDI+中有三个分开的坐标系空间(世界、 页面和设备): 1. World coordinate space. 世界坐标是用于建立特殊图形世界模型的坐标系, 也是在 .NET Framework 中传递给方法的坐标系。它是图像系统中的二维空间。World coordinate是经过两个浮点表示
6、的抽象值。基本上, 绘制任何东西最终都会转换到这个空间。 2. Page Coordinate Space. 页面坐标系是指绘图图面( 如窗体或控件) 使用的坐标系。 该空间用来对应真实世界的尺度。能够设定Page Coordinate来代表点、 英寸、 毫米等等。这就是GDI+是个独立的解决方案的来源。能够设置使用的PageUnit, 调整PageScale来达到这一点. 3. Device Coordinate Space. 设备坐标系是在其上进行绘制的物理设备( 如屏幕或纸张) 所使用的坐标系。这个空间有系统控制, 转换在Page空间中的坐标到屏幕、 打印机能够使用的空间。可能屏幕、
7、 打印机的分辨率不一样, 那么同样一英寸可能在设备上显示不一样多的点。 当调用 myGraphics.DrawLine(myPen, 0, 0, 160, 80) 时, 传递给 DrawLine 方法的点( (0, 0) 和 (160, 80)) 位于世界坐标空间内。在 GDI+ 能够在屏幕上绘制线条之前, 坐标先要经过一系列变换。一种称为”世界变换”的变换可将世界坐标转换为页面坐标, 而另一种称为”页面变换”的变换可将页面坐标转换为设备坐标。 二、 投影坐标与屏幕坐标的转换 1.投影坐标系( Projected Coordinate Systems) 投影坐标系使用基于X,Y值的
8、坐标系统来描述地球上某个点所处的位置。这个坐标系是从地球的近似椭球体投影得到的, 它对应于某个地理坐标系。投影坐标系由以下参数确定: 地理坐标系( 由基准面确定, 比如: 北京54、 西安80、 WGS84) l 投影方法( 比如高斯-克吕格、 Lambert投影、 Mercator投影) l 一般主要用高斯—克吕格坐标。高斯—克吕格投影的直角坐标系统是按经差6°分带单独投影, 故各带坐标也成独立系统。在投影带中, 以中央经线为纵轴( x) , 赤道为横轴( y) , 两轴交点为原点。 2. 屏幕坐标( Screen coordinate) 在Windows 应用程序中涉及
9、到的设备坐标系有三种:屏幕坐标系,窗口坐标系和用户区坐标系。屏幕坐标系以整个显示器屏幕作为坐标区域,坐标原点在屏幕的左上角,X 轴水平向右为正,Y轴竖直向下为正。屏幕坐标和应用程序无关,对所有的应用程序是唯一的。 3.坐标的转换 在GDI+中, 屏幕坐标系统与数学中的坐标系统并不一样, 要在GDI+中使用投影坐标系统, 则需要在屏幕坐标的基础上进行坐标的变换, 例如旋转, 平移等。 假定想使用原点位于工作区的主体而非左上角的坐标系统。例如, 让原点位于距工作区左边缘 100 像素、 距顶部 50 像素的位置。下图显示了这样的坐标系统。 当调用 myGraphics.DrawLine
10、myPen, 0, 0, 160, 80) 时, 可得到下面的插图中所显示的线条。 用于将世界坐标映射到页面坐标的世界变换保存在 Graphics 类的 Transform 属性中。在前面的示例中, 世界变换是在 x 方向平移 100 个单位、 在 y 方向平移 50 个单位。下面的示例设置了 Graphics 对象的世界变换, 然后使用该 Graphics 对象绘制前图中显示的线条: myGraphics.TranslateTransform(100, 50); myGraphics.DrawLine(myPen, 0, 0, 160, 80); 页面变换将页面坐标映射到
11、设备坐标。 Graphics 类提供了用于操作页面变换的 PageUnit 和 PageScale 属性。 Graphics 类还提供了两个只读属性: DpiX 和 DpiY, 用于检查显示设备每英寸的水平点数和垂直点数。可使用 Graphics 类的 PageUnit 属性指定除像素以外的其它度量单位。 以下是以C#语言环境下进行的屏幕坐标经过旋转和平移等手段转换成高斯投影坐标: namespace 坐标转换 { static class 坐标系 { static public float 缩放系数 = 1.0f; stati
12、c public float 屏幕中点绘图坐标_X; static public float 屏幕中点绘图坐标_Y; static float 半宽; static float 半高; static public void 设置图板大小(float 宽, float 高) { 半宽 = 宽 / 2; 半高 = 高 / 2; } public static void 设置显示参数(Graphics pGraphics)
13、 { pGraphics.PageUnit = GraphicsUnit.Pixel; float e = 半宽 - 缩放系数 * 屏幕中点绘图坐标_X; float f = 半高 + 缩放系数 * 屏幕中点绘图坐标_Y; Matrix myMatrix = new Matrix(缩放系数, 0.0f, 0.0f, -缩放系数, e, f); pGraphics.Transform = myMatrix; }
14、public static void 设置全局系数() { float scaleX = 半宽 / 参数.桌面宽 * 2; float scaleY = 半高 / 参数.桌面高 * 2; float scale = scaleX; if (scaleY < scaleX) scale = scaleY; scale *= 0.98f; 缩放系数 = scale; 屏幕中点绘图坐标_X = 参数.桌
15、面宽 * 0.5f; 屏幕中点绘图坐标_Y = 参数.桌面高 * 0.5f; } } } 三、 总结 本文阐述了基于GDI+技术的屏幕坐标与投影坐标间的转换。在实际图像处理中, 常常需要进行坐标间的转换, 即将坐标中实际数据向图形的像素数据转换时, 用到的公式参数均来自于坐标, 这里只是对其中两种常见坐标进行了初研究, 后续的研究还很广阔, 经过这样的研究能够极大的方便坐标间的相互转换以及图像的处理。 参考文献: [1]邓宇军,凌海风,迟长啸. C#语言程序设计基础. 北京:清华大学出版, . [2]
16、 赵森, 许振宇, 张秉权A 地理坐标与直角坐标相互转换的算法[J].火力与指挥控制, , 26( 4) : 64- 66. [3]ChristianGraus.StartingwithGDI+[EB/OL].http//.com/vepp/gdiphus/startinggdiphus.asp CodeProject. -05 [4]Mashesh Chard.GDI+图形程序设计[M].北京:电子工业出版社, [5]CodeMaze.Hints get GDI+running[EB/OL].http//.com/useritens/CodeMaze.asp CodeProject. -05 基于GDI+的投影坐标与屏幕坐标的转换研究 专 业: 地图学与地理信息系统 姓 名: 陈艳梅 学 号: 056 指导老师: 刘德儿






