热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从truetype字体中提取符号

做gis的朋友对地图符号并不陌生,地图上的各种要素正是由于有了符号而变得绚丽多彩。我这里要说的符号是指的点符号。用过mo、ae、等gis平台做二次开发的都知道,在设置点状要素symbol的时
 做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/)


推荐阅读
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
author-avatar
幸福-一路向南_654
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有