bluntsword

博客园 联系 订阅 管理
  2 Posts :: 0 Stories :: 10 Comments :: 1 Trackbacks

    最近用GDIPlus做符号库,发现很多问题,nightware已经在一篇文章《GDI+的雷区 》中指出过http://blog.csdn.net/Nightmare/archive/2005/04/22/359092.aspx

    nightware说得很对,但我觉得还有一点必须提出来,GDIPlus使用float型,精度不够,在缩放比达到float的最小数值极限,问题就出来了,而在GIS程序中这个还是很容易碰到的。

    另外,提供了int型坐标的所有绘制方法应该都只是调用了float型坐标的方法,因为GDIPlus的绘制坐标都是世界坐标,int型此时只有做一个全部都用int型坐标的简单程序时才用得上,实际应用中,这种程序通常只是玩具。所以提供int型坐标是意义不大的。

    另外GDIPlus中还有很多的bug,比如下面一个例子,可能还是精度的问题,包括取样精度。scale小于168000f时,矩形、椭圆和直线都可以绘制出来、到168000f时,直线绘制不出来了,到169000f时,椭圆也出不来了。

float scale = 168000f;
float width = 100f / scale;

PointF pt = new PointF(100f, 100f);

RectangleF rect = new RectangleF(pt.X, pt.Y, width, width);

e.Graphics.TranslateTransform(pt.X, pt.Y);
e.Graphics.ScaleTransform(scale, scale);
e.Graphics.TranslateTransform(-pt.X, -pt.Y);

e.Graphics.FillRectangle(new SolidBrush(Color.Red), rect);
e.Graphics.FillEllipse(new SolidBrush(Color.Green), rect);
e.Graphics.DrawLine(new Pen(Color.Blue, 0), pt, new PointF(pt.X + width, pt.Y + width));

    提一下GDIPlus的绘制效率。我测试了5000个多边形,大约15M点数据。在VC下用GDI绘制大约450ms,C#用GDIPlus大约1450ms,VC下用OpenGL绘制只要几十毫秒。记得以前看过有人做过测试,但我找不到那篇文章了。

    要解决精度的问题,除非不用GDI+的坐标转换,整个绘制过程中保持世界坐标系和设备坐标系统一,然后自己记录实际坐标与设备坐标的缩放和偏移,然后在绘制时将实际坐标转换为设备坐标。以前用GDI就是这么干的,因为VC做这种计算很快,release下上面的15M数据只用20-30ms。但在C#中这个计算要200-300ms,太耗时间。

    总结下来,GDIPlus真的比较垃圾,不过做对精度和绘制效率要求不高的图形程序,用GDIPlus可以很容易做出很花的效果。

posted on 2005-08-10 11:34 钝刀重剑 阅读(1335) 评论(9)  编辑 收藏 所属分类: GISC/C++/.NET

Feedback

#1楼  2005-08-10 20:27 edison1024      
TMD,我们都趟雷牺牲了。555
  回复  引用  查看    

最近为一个WebGIS项目刚做完的影像数据提取部分,基于ArcSDE的,在VC下面用SDE API做的,其中最后的绘制图像(Jpeg格式的)用了GDI+,感觉比较好用,不用考虑很多东西,因为我比较懒~~。“雷区”里提到的问题也确实有,不过不少应用还是可以不会触雷的 :-)
  回复  引用    

#3楼  2005-08-18 22:40 edison1024      
做一班的应用程序的UI的足够了。
但是用于开发底层GIS平台,GDI+真不是个东西。。。。
  回复  引用  查看    

#4楼  2005-08-18 22:58 bluntsword [未注册用户]
TO合金枪头:
GDI+对于绘制影像来说,影响不大,而且功能更强大了,只不过绘制效率比较低。不过一般也不会注意这点,特别SDE取出的图片通过金字塔处理,都很小。其实绘制图像,用GDI、GDI+都差不多,如果你不用GDI+另外提供的功能,建议你还是用GDI比较好。
  回复  引用    

#5楼  2005-11-09 18:54 gem.tang [未注册用户]
也不能说趟雷牺牲了吧,诸位还是不要悲观哦~
虽然,M$经常搞一些抛弃开发者的事情,新版的IDE、新版的SDK层出不穷,但是人家还是一直在进步的嘛!GDI plus 2.0可能会有改进的,而且你不紧追M$的脚步——后果可想而知,历史也是有的,比如Windows 95以前的程序员。

作GIS底层开发,想用 Gdiplus::***F 等类,来代替坐标转换是不好的,象Shape文件,就是double精度的,况且自己进行坐标转换也不难,简单的仿射变换而已。

GDIplus支持几十种面填充方式,这个也很方便了我们作地图渲染啊。

对于TrueType字体、符号方面,我还没有具体测试,如果有经验的同行,欢迎指教、探讨。
  回复  引用    

#6楼  2006-02-18 18:21 Zhao [未注册用户]
关注这个问题的人太少了,呵呵
  回复  引用    

#7楼  2006-02-18 18:42 Zhao [未注册用户]
发现一个问题,GDI+变换之后的坐标被限制在以下范围
x -4194304.0f
y -4194304.0f
width 8388608.0f
height 8388608.0f
如果超出范围,图形画不出,
不知道M$的人怎么想的

  回复  引用    

#8楼  2006-03-19 23:12 gis人 [未注册用户]
gis人自己的博客
http://www.gisblog.com

  回复  引用    

#9楼  2007-08-27 11:37 邓林海      
初学者
  回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-08-10 20:18 编辑过


相关链接: