从truetype字体中提取符号

 做gis的朋友对地图符号并不陌生,地图上的各种要素正是由于有了符号而变得绚丽多彩。我这里要说的符号是指的点符号。

    用过mo、ae、等gis平台做二次开发的都知道,在设置点状要素symbol的时候,都有一种symbol类型为truetype symbol,有一个font的属性来指定truetype字体,并有一个charactorIndex的属性用来指定符号的索引号,通过这两个属性即可得到一个符号。相对应,在arcgis桌面软件中,有个点状符号选择工具,能够将指定字体中的所有符号列出来,让用户去选择合适的符号。

     之前我对如何实现这种功能查阅了大量的资料,但是收获甚微//,大多数的资料所做的努力都是从字体文件中提取字模。前几天有事需要查ascii码表的时候,再对照之前所看到的符号,发现两者竟是同一套东西,只是两套不同的表现方式而已。

    可以这么理解,ascii码中的字符(比如97代表‘a’,'a'就是ascii中的一个字符)通过不同的字体来表现,得到的就是不同的符号了,这其中的原理还不是很清楚,但是知道了这些已经不妨碍我们做出一个完美的符号选择器了。


       实现方式有两种,但这两种方式的本质是一样的。第一种方式实现起来非常简单,也很好控制,最好在仅仅展现符号的情况下使用,但不能表现出很丰富的效果来。第二种方式通过GDI+来实现,通过提取每个符号的字模(即符号轮廓)为路径,可以实现很多的高级展现功能,也可将提取出来的路径直接用在地图上,和地图要素集一起进行绘制。
 

         //第一种实现方式

           Label[] labSymbols = new Label[256];         

          for(int i = 0; i < 256; i++)
          {
               labSymbols[i].Font = #你指定的字体#;
               labSymbols[i].Text = new string(Convert.ToChar(i), 1);
           }

           

            ///第二种实现方式

             private void DrawCharactorsOutLines(ref Graphics g)
           {
                System.Drawing.Drawing2D.GraphicsPath oOutline = new System.Drawing.Drawing2D.GraphicsPath();
                int iSymbolIndex = 0;
                g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;

                for (int i = 0; i < 16; i++)
               {
                    for (int j = 0; j < 16; j++)
                   {
                       string sCharactor = new string(Convert.ToChar(iSymbolIndex++), 1);
                       oOutline = new System.Drawing.Drawing2D.GraphicsPath();
                       oOutline.AddString(sCharactor, this._curFont.FontFamily, (int)FontStyle.Regular, this._fontSize - 7, new Point(j * this._fontSize, i * this._fontSize), StringFormat.GenericDefault);
                       g.FillPath(new SolidBrush(Color.Black), oOutline);
                       oOutline.Dispose();
                   }
              }
        }

上面都是用C#写的示例代码,我已经写好了一个完整的符号选择控件,如有需要,可以和我联系。

(转自:http://blog.163.com/lionyue@126/blog/static/10793071200801935736483/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值