热门标签 | 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/)


推荐阅读
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤
    开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤 ... [详细]
  • 在探讨如何在Android的TextView中实现多彩文字与多样化字体效果时,本文提供了一种不依赖HTML技术的解决方案。通过使用SpannableString和相关的Span类,开发者可以轻松地为文本添加丰富的样式和颜色,从而提升用户体验。文章详细介绍了实现过程中的关键步骤和技术细节,帮助开发者快速掌握这一技巧。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
  • 如何在C#中配置组合框的背景颜色? ... [详细]
  • 使用 Vuex 管理表单状态:当输入框失去焦点时自动恢复初始值 ... [详细]
  • 在Django中提交表单时遇到值错误问题如何解决?
    在Django项目中,当用户提交包含多个选择目标的表单时,可能会遇到值错误问题。本文将探讨如何通过优化表单处理逻辑和验证机制来有效解决这一问题,确保表单数据的准确性和完整性。 ... [详细]
  • 深入解析C#中app.config文件的配置与修改方法
    在C#开发过程中,经常需要对系统的配置文件进行读写操作,如系统初始化参数的修改或运行时参数的更新。本文将详细介绍如何在C#中正确配置和修改app.config文件,包括其结构、常见用法以及最佳实践。此外,还将探讨exe.config文件的生成机制及其在不同环境下的应用,帮助开发者更好地管理和维护应用程序的配置信息。 ... [详细]
  • 本文探讨了如何在C#应用程序中通过选择ComboBox项从MySQL数据库中检索数据值。具体介绍了在事件处理方法 `comboBox2_SelectedIndexChanged` 中可能出现的常见错误,并提供了详细的解决方案和优化建议,以确保数据能够正确且高效地从数据库中读取并显示在界面上。此外,还讨论了连接字符串的配置、SQL查询语句的编写以及异常处理的最佳实践,帮助开发者避免常见的陷阱并提高代码的健壮性。 ... [详细]
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社区 版权所有