精华内容
下载资源
问答
  • 通过矢量字库制作点阵字库

    千次阅读 2014-09-18 12:33:35
    1、字库导出步骤  涉及软件:FontEditor ...能将 TTF,OTF 矢量字库转换为 BDF 字符,可以很方便的将Windows 已经安装到系统的矢量字库转换为 BDF 字库,并能将 TTF,OTF 文件直接转换成 BDF 格式,并支持 BDF,FNT
     
    

    1、字库导出步骤

            涉及软件:FontEditor 1.3.3

            FontEditor 为一款功能强大的字体编辑和字体格式转换工具,支持制作 32*32 的全字库。能将 TTF,OTF 矢量字库转换为 BDF 字符,可以很方便的将Windows 已经安装到系统的矢量字库转换为 BDF 字库,并能将 TTF,OTF 文件直接转换成 BDF 格式,并支持 BDF,FNT,FNB 文件格式的互转换,随心所欲将 windows字体应用于各种嵌入式系统中。并支持将 GB2312,BIG5,GBK 转换为 UCS2,UTF8,并支持 UCS2,UTF8 编码的互转换。

            导出步骤:

            a:导入 windows 字体,选择字体大小以及字形。

            b:T 出没用的字符

            c:选中需要保存的字符保存,可以直接保存为bdf 或者导出位图文件(每个字符的 bmp 图,用于生成 bdf)。

            步骤如下图所示:


           


           


           


           


           


           


           


    2、字符修改
            涉及软件:MCT6.0、FontEditor 1.3.3
            a、用 MCT6.0 打开生成好的 bdf 文件,对要求不符的字库进行修改。
            b、选择 tools->font tools->font viewer 打开:

           

           c、单击 open bdf file ,选择自己要使用的字库资源,这时候可以看到字库里包含的所有元素。                                 
         

           d、点击 font edit,Edit UCS2,输入需要修改的字符的unicode 码,如下图所示:

           

           其中,几个参数需要注意。第一是 DWIDTH 的值,此值的意思是下一个字符相对此字符的距离,举个例子,若 dwidth 是 10,字符宽度为 10,则下一个字符是紧挨着这个字符。一般 DWIDTH 的值要小于等于字符本身的宽度。第二个是 BBX,BBX 中的前 2 个参数的意思分别为字符宽高,此 2 个值要与 FONTBOUNDINGBOX 的前 2 个值进行区别,FONTBOUNDINGBOX 的前 2 个值是字库中字符的最大宽高。这几个值修改好之后,对左边框框内的字符进行重新绘制,绘制完后保存。注:修改字符不建议使用 fonteditor 软件,保存时会自动修改字符部分参数。


    3、调整基准线

           如上图所示:一般的字库中的字符都有一条基准线,有了这条基准线,字符显示才能有规则,显得整齐。调整方法如下:

    方法一:可以直接修改 bdf 内 BITMAP 下数组:

           

    方法二:用 fontedit 打开字符,直接上移下移调整

           

    4、点阵字库,如何检查BDF 文件的规范性

           可从以下几个方面来查看该字库文件是否有错误,bdf 文件的规范与否会直接影响字符的显示。

           a 检查字符是否等高,目前mct 只支持等高的情况。查看每一个字符的BBX 第二个参数,若不相等则说明该字库不符合规范,建议更换;(目前遇到的问题主要是客户用的点阵字体是用矢量字体转换而来的,因此打开bdf 文件后很清晰地看到字符的高度不一致,这样显示多会出现乱码。)

           b 查看sCustFontData 数组中第五个参数若为0 表示非等宽,若为1 表示等宽。若为等宽情况则每一个字符BBX 中的一个参数即字符宽度都应该相同;

           c 检查sCustFontData 数组中信息是否正确:

           如sCustFontData Pluto_Small = {

           12, 12, 7, 2, 0, 14, 500,

           (U8*)UH9x9_4p_Width,

           (U8*)UH9x9_4p_Width, (U32*)UH9x9_4p_Offset,(U8*)UH9x9_4p_Data,

           (U32*)UH9x9_4p_RangeOffset,

           „„.}

           此例出现的现象就是字符显示间隔较大,长宽均为12,与宽度数组、偏移量数组中9*9 的不符,第六个参数是该字符的字节数,数值上应等于(长×宽)/8.

           d 若添加字库后字符间距很大,除了考虑以上几个方面外,还应查看bdf 文件中FONTBOUNDINGBOX第三个参数,应与BBX 第三个相近或相同,若相差太大,MCT 处理时会根据FONTBOUNDINGBOX 的大小进行填充,这样也会出现字符间距很大的现象。

           e 若为印度语系,如泰古拉语、孟加拉语,需检查bdf文件中参数DWIDTH,该参数表示字符的显示宽度,应小于等于字符本身的宽度,否则不能正确显示出连字的效果。



    展开全文
  • 制作TTF格式的字体

    千次阅读 2015-08-06 16:06:34
    字体制作 1、绘制矢量图形,注意路径必须是闭合的,否则会给后续工作带来麻烦。 通过AI,导出“增强型图元文件”.emf格式的文件。 2、用CorelDRAW打开,打开“排列”菜单—“修正”调出“焊接面板”。然后选中图形...

    字体制作

    1、绘制矢量图形,注意路径必须是闭合的,否则会给后续工作带来麻烦。

    通过AI,导出“增强型图元文件”.emf格式的文件。


    2、用CorelDRAW打开,打开“排列”菜单—“修正”调出“焊接面板”。然后选中图形,点击“焊接至”,当鼠标变成如图形状,点击图形的任意部位,完成焊接。最后再调整图形的大小,尽量充满工作区。

     

    然后“导出”,给字体组写上第一名称(汉字命名)。点击确定后,在弹出的窗口中输入第二个名称(字母命名),选择字符块BasicLatin ,输入字符数33。(记录图形对应的字符号,很重要,方便日后对某个图形单独进行修改。)




    将第一名称(汉字命名)文件,即*.ttf文件复制到“控制面板—字体”中。

    3、打开word,“插入—特殊符号—其他符号”,选择字体(字母命名),找到刚才存入的字体。


    展开全文
  • 于是有些朋友选择了自己绘制,这当然解决了当时的问题,可你有没有想过,把你绘制的字符图形制作成为真正意义上的、能够在Windows系统中使用的字体呢?或许你会认为这是专业软件公司的事,个人制作是不是太困难了? ...
     不少做平面的朋友可能都有过这样的经历:在自己的作品中要使用某种特效字体,但是到处都找不到符合自己要求的。于是有些朋友选择了自己绘制,这当然解决了当时的问题,可你有没有想过,把你绘制的字符图形制作成为真正意义上的、能够在Windows系统中使用的字体呢?或许你会认为这是专业软件公司的事,个人制作是不是太困难了? 
    

      其实只要我们选好工具,掌握方法,制作自己的字体并不困难。

      

      一、字体基本知识

      平时我们常见的字体格式主要有以下几种:

      1.光栅字体(.FON)

      这种字体是针对特定的显示分辨率以不同大小存储的位图,用于Windows系统中屏幕上的菜单、按钮等处文字的显示。它并不是以矢量描述的,放大以后会出现锯齿,只适合屏幕描述。不过它的显示速度非常快,所以作为系统字体而在Windows中使用。

      2.矢量字体(.FON)

      虽然扩展名和光栅字体一样,但是这种字体却是由基于矢量的数学模型定义的,是Windows系统字体的一类,一些windows应用程序会在较大尺寸的屏幕显示中自动使用矢量字体来代替光栅字体的显示。

      3.PostScript字体(.PFM)

      这种字体基于另一种矢量语言(Adobe PostScript)的描述,常用于PostScript打印机中,不过Windows并不直接支持这类字体,要在Windows使用这类字体需要安装"Adobe Type Manger"(ATM)软件来进行协调。

      4.TrueType字体(.TTF)

      这是我们日常操作中接触得最多的一种类型的字体,其最大的特点就是它是由一种数学模式来进行定义的基于轮廓技术的字体,这使得它们比基于矢量的字体更容易处理,保证了屏幕与打印输出的一致性。同时,这类字体和矢量字体一样可以随意缩放、旋转而不必担心会出现锯齿。我们下面要制作的字体就属于这一类型。

            静蕾字体的制作过程

    当然,方正制作字库远远不会如此简单,只是在这里说一下大概的过程:

    一般分为三个步骤:
    1,设计字模
    2,对字模进行矢量化处理
    3,将矢量化处理后的字型数据编译为truetype字体文件

    其中:
    步骤“1,设计字模”有三种方法:
    1.1,请书法家/设计师手工设计/书写全部国标二级字库。
    1.2,通过建立字型架构数据库, 人工书写几千个汉字,在生成全部字库的字模,部分汉字需要

    人工后期修正,目前大部分字体公司采用这种方法设计字模。
    1.3,通过人工智能手段,根据汉字的架构特征,建立各种知识库,再利用专业的计算机软件生成

    字模,《中华大字库》采用的是这种方案。

    步骤“2,对字模进行矢量化处理”,不同的企业由于采用不同的软件,有所差异,字王采用的是

    开源矢量化软件potrace。

    步骤“3,将矢量化处理后的字型数据编译为truetype字体文件”,也有许多不同的软件,字王采

    用的是ttx程序。
    另外,许多专业的字型设计软件自身已经集成了以上三个模块,目前最好的字型设计开源软件是

    fontforge。
    2006年初,字王将发布自己的开源字型设计软件x2ttf
    我们如何制作自己的字体?

    英文字体制作:

    一个完整的TTF字体有基本拉丁文(字母A-Z大小写、常用符号)、扩展拉丁文(音标、注音符号)、图形符号、控制符号以及其他很多部分组成,不过我们可以制作只包含基本拉丁文区的字体。我们这里要用到两个软件:CorelDraw、Font Creator Program。下面我们就开始字体的制作。

      二、制作自己的字体

      第一步 用CorelDraw完成字符绘制

      相信对于每个搞平面设计的朋友来说,CorelDraw应该是非常熟悉的了。使用它来绘制字体主要有两个原因:一是CorelDraw的图形绘制功能非常强大,绘制复杂形状的图形易如反掌;二是在同类软件中CorelDraw是唯一一款直接支持TrueTupe(.TTF)输出的。

      注意!CorelDraw10的默认安装是不包含TTF格式输出支持的,需要在安装时选择"自定义安装",并且在"导出文件类型"中的"矢量文件格式"里面选中"TTF字体/TTF"一项。不过到了最新的CorelDraw11,这项功能却不见了。下面我以目前常用的CorelDraw10为例,讲述一下使用CorelDraw输出字体方法。

      1.启动CorelDraw,绘制出要作为字体的图形(在此省略了具体的图形绘制的过程,具体的绘制方法可以参阅其他相关教程和书籍或访问天极设计在线的 CorelDraw专栏)。

      

      2.将要作为单个字符的对象使用焊接或者组合工具组合成单一对象。这一点很重要,因为CorelDraw导出字体对象时一次只能导出一个单一对象,否则会提示"对象太多"而无法导出。有时将字符对象组合后可能会得不到我们所希望的结果,这一点应在开始绘制时就应该考虑。

    3.将所有对象的组合操作完成后,选中其中一个要作为字符的对象(在这里选择的是小写的"a"),点击"文件"-"导出"或直接按下快捷键"Ctrl+E"。此时将弹出"导出"对话框,在文件类型中选择"TTF-TTF字体文件",在文件名称中输入要导出的字体文件的名称,并且确认已在右下角复选框中的"仅选中的"一项前打上钩。

      

      4.按下"导出"按钮,弹出"导出选项"对话框。在类别名称中输入一个名称(由于我们制作的字体并不用于商业发布,不必遵循严格的标准,可以随意输入)。选中"符号字体"一项,这样字体将作为符号字体生成而不具有内部索引和倾斜加粗等内部属性。

      

      5.按下"确定"后会弹出一个对话框要求再次确认,再次点击"确定"进入"字体导出" 对话框。由于在这里只制作了字母A-Z的大小写和标点符号,因此在右上角"字符块"的下拉列表中选择"基本拉丁文",在下面的列表中选中小写字母"a"。我们还可以点击左下角的"选项"按钮调出刚才的"导出选项" 对话框来对之前的设定进行修改。在"选项"按钮上面的部分主要是字符的行列间距、字符大小等的设定,建议还是到Font Creator Program中进行设置,在那里的设置要比在CorelDraw中的更直观、便捷。

    6.再次按下"确定"按钮,一个只包含一个字母的字体文件已经被导出了。再次选中下一个字符"b",按下"Ctrl+E"在"导出"对话框中选中刚才导出的文件。点击"导出"将直接弹出"字体导出" 对话框,这时会发现在右侧的列表中小写字母"a"已经显示为黑色了,这表示在这个字体中已经包含这个字母了。在表中选择"b"按下"确定"后,字母"b"就被追加到刚才生成的文件中去了。

      7.按照以上的步骤,依次将其余的字母及符号追加入那个文件,一个基本的符号字体文件初步己制作完成了。

      第二步 用Font Creator Program完成字体调整和打包

      Font Creator Program对于一些朋友来说可能有些陌生,它是一款不错的字体制作软件,可以用来绘制字体、写入字体版权信息、控制字体属性等。这款软件是由High Logic公司推出的一款共享软件,如果不注册只能使用30天。下面我以目前常用的由YC-周汉化的Font Creator Program3.0版本为例,讲述一个真正意义上的字体整理打包的过程。

      1.启动Font Creator Program,其界面如下:

      2.选择"文件"-"打开"-"字体文件",打开刚才制作的字体文件(其实前面CorelDraw制作的TTF文件已经能够使用了,只是使用CorelDraw生成的字体文件很不稳定,容易导致死机,因此这里使用Font Creator Program进行整理)。

      3.不要关闭刚才打开的文件。选择"文件"-"新建",弹出"新建文件"对话框,这里有三种字符集可供选择:

    a.Symbol(符号字体),这类字体内部不包含索引表,自由性比较大,通常用来存储一些非标准符号,在一些软件中可以作为图形插入,Windows中的Wingding就属于这种字体;

      b.Unicode(编码字体),这是现在最常见的一种类型,主要是为了协调东西方语言的字符数量相差悬殊而制定的一种16位符号编码策略。Unicode可以表达65536个字符并为每个符号建立唯一的字码,保证了字符编码的正确性。

      c.WGL4,这种字体和Unicode很相似,Font Creator Program在安装目录中的"Template"子目录里提供了一个WGL4编码的字体,有兴趣的话可以看看;

      在此选择Unicode一项,新建一个空白的字体文件。

      4.切换到刚才打开的那个刚制作出来的字体文件(可以注意到它在Font Creator Program中显示非常混乱,这也是不推荐直接使用CorelDraw输出的字体文件的一个原因),双击其中的一个方框,将弹出字符编辑窗口。用鼠标拖曳一个矩形框将其中的字符全部选中,按下"Ctrl+C"将其复制到剪贴板中。

      

      5.回到刚才新建的那个文件,发现和CoreldRAW输出的符号字体不同,Unicode字体在每一个代表字符的方框左上角都显示了一个对应此位置编码的字符。刚才复制出来的是"a",这时候就可以在左上角显示为"a"的方框上双击,在弹出的空白字符编辑窗口中按下"Ctrl+V"将剪贴版中的字符复制进去。由于CoreldRAW默认输出的字符的大小和位置都不理想,虽然字符已经被复制入当前的编辑窗口,却不在显示范围之内。可以通过工具栏上的""按钮来最大化显示当前对象,或者用""按钮来进行放大/缩小显示。

    6.调整好了适合的观察范围,会发现刚才复制进去的字符居然在整个编辑区偏右且非常靠上面的地方,这显然是不正确的。此时可以用拖拽的方法将其拖到画面中两条红线的相交处(原点),也可以使用"变换"浮动窗,利用精确的数值对当前对象进行调整,相信会使用CorelDraw的朋友对此应该不会陌生。在"大小"选项卡中设置字符的大小;在"位置"选项卡的"x位置"和"y位置"中输入"0",将对象移动到原点。进一步观察字符编辑窗口,发现除了两条相交的红线以外还有两条水平的黑线和两条垂直的黑色虚线,其中:垂直的线表示了字距,水平的表示了行距。水平黑线无法调整,制作的字符大小以在两条黑线内为宜;垂直的黑色虚线是可以拖拽的,通过拖拽黑色虚线来决定该字符与其它字符的间距。

      

      7.完成该字符编辑后,将字符编辑窗口关闭。这时代表字符的方框的左上角显示的"a"已经由灰色变为绿色了,表明当前位置中已经有物件了,此时建议将文件保存一次。重复4-6步骤,将其他的字符也用相同的方法转移到新建的文件中并进行调整。当所有的字符都完成以后,会发现新建的文件中的字符显示要比最初由CorelDraw直接生成的文件中的整齐多了。

      

      8.在所有的字符都处理完成了以后,可以按下"F5"键进入字体测试窗口对刚才制作的文件进行测试。如果发现不满意的字符,可以再按照前面的步骤重新调整。

      

      9.在字符都已经绘制完成以后,就可以将字体命名发布了,由于这里制作的不是用于商业发布的字体,自然不必遵循严格的命名规范。点击"格式"-"命名",进入"命名对话框"。在右边的命名区中输入自己想要的内容,要注意的是,"版权信息"、"字体系列名称"、"字体完整名称"和"字体子集名称"最好不要空白,其他的则可以不选。点击右下角的"高级"按钮还可以对字体的名称进行进阶设定。在左边的"平台"设置区可以选择不同的平台,同时右边的命名区中的内容也会相应改变。

      

      10.按下"保存"按钮,一个自己制作的字体就大功告成。欣赏一下自己的劳动成果吧,如果你愿意的话,还可以拿到网上去发布。

     

    汉字字体制作


         做汉字字库本身并不困难,象利用专门的字体设计软件:fontforge,可以很轻松地完成

    字库的设计。
         字库设计的瓶颈在于字模,关于字模的设计因为涉及到书法以及技术等多个领域,很复杂

    ,你可以自己查询一些资料。
         对于初学者,可以先通过形成的中文字库,到处国标二级字库的字型图片,作为试验字模

    ,按我们在前贴介绍的3个步骤,进行矢量化,再编译成ttf字体文件。
         或者直接导入到forgefont等专业字型设计软件,生成ttf字库文件。
         在此基础上,你在现有的字体造型基础上,对字体进行修改,设计出各种风格的字模


    最后大家不要忘了,字库文件要复制到X:/WINDOWS/FONT/文件夹中

    制作字体(TTF)的程序,除可以自行制作字体外也能够直接编辑修改 Windows 操作系统上的

    任何 TrueType 字体,制作好的字体或修改好的字体能够让你保存和使用。
      下面就介绍一下如何使用Font Creator Program创建新字体。
      运行Font Creator Program,点击“文件→新建”,在弹出的“创建TTF字体”窗口中给新字

    体命名,点击“确定”按钮就打开了“字体编辑”窗口。
      在“字体编辑”窗口中双击某一个字符,例如“L”,就可以进入“L”的编辑模式。点击“

    插入→轮廓”,使用笔触画出“L”的大致轮廓,然后再通过在字符上添加节点,以调整字符的具

    体样式。
      将所有的字符全部制作完成之后,就可以点击“文件→保存”,将刚才制作的内容保存为一

    个新的字体文件。
      如果觉得全部自己制作过于麻烦,那么我们也可以利用Font Creator Program对现有的字体

    进行修改。点击“文件→打开→字体文件”,导入一种字体,然后就可以对该字体的每一个字符

    进行个性化的修改了。

     

    展开全文
  • 在VC6.0上制作矢量字库

    千次阅读 2016-06-05 22:57:39
    在做项目时,客户由于要求用矢量字体,不得已研究下矢量字体,在此分享字库制作 一.在vc6.0上安装freetype  a.向往http://download.savannah.gnu.org/releases/freetype/ 下载freetype安装包。    b.进入builds...
     
    

    在做项目时,客户由于要求矢量字体,不得已研究下矢量字体,在此分享字库的制作
    一.在vc6.0上安装freetype
       a.向往
    http://download.savannah.gnu.org/releases/freetype/ 下载freetype安装包。

        
       b.进入builds/文件夹下,在许多平台上都可以编译freetype.在这里选择win32\visualc\
    c.打开*.dsp文件,编译下,在freetype-2.4.0\objs\目录下会生成一个静态库文件freetype.lib*.dll,在制作字库时会用的.

      c.新建一个工程,拷贝freetype目录下include文件夹复制到自己工程中,把freetype.lib和freetype.dll文件拷贝到新建的工程中.

        

       

       d.打开菜单project->settings->c/c++中,在category中选择preprocessor再添加指令文件的路径(如图1-2),选择Link项,在library modules:添加freetype.lib(如图1-1)

              

                                                                             1-0

                       
                                                                            1-1
     
       e.添加测试代码
    #include "ft2build.h"
    #include FT_FREETYPE_H
    
    void TestTrueType()
    {
        FT_Library          m_pFTLib;
          FT_Face     m_pFTFace;
    
           FT_Error error = FT_Init_FreeType(&m_pFTLib);
           if(FT_New_Face(m_pFTLib, "C:/WINDOWS/Fonts/simkai.ttf", 0, &m_pFTFace))
           {
               return;
           }
           FT_Select_Charmap(m_pFTFace, FT_ENCODING_UNICODE); 
           FT_Set_Char_Size(m_pFTFace, 0, 12<<6, 300, 300);
    
     
    
    // 此出将"A"改为汉字,则只显示出一个框;
           error = FT_Load_Glyph(m_pFTFace, FT_Get_Char_Index(m_pFTFace, 'A'), FT_LOAD_DEFAULT);
           // 第二个参数为渲染模式,这里渲染为1位位图(黑白位图),若为FT_RENDER_MODE_NORMAL则渲染为256级灰度图;  
           error = FT_Render_Glyph(m_pFTFace->glyph,  FT_RENDER_MODE_NORMAL);  
    
           FT_Bitmap& bmp = m_pFTFace->glyph->bitmap;
           int h = bmp.rows;
           int w = bmp.width;
    
    
         
           for(int i=0; i<h; i++)
           {
               for(int j=0; j<w; j++)
               {
                   if((bmp.buffer[i * w  + j]) == 0 ) {
                     printf("0");
                   }
                   else
                   {
                      printf("1");
                   }
               }
    
            printf("\n");
           }
    
    }
    
    
    int main(int argc, char **argv)
    {
        TestTrueType();
    	
    	return 0;
    }
        运行结果:
      
       这里显示的是点阵字体,我们要做矢量字库。

    二.在vc6.0上制作字库

        网上关于矢量字体讲述很多这里不细说。 

        a.这里制作分别是英文字库和汉字字库(GB2312码)

        b.关于字体,可以自己随便选择。

        c.有时候制作矢量字体可能少了些笔画,需要程序相应的调整。

           

    #include "ft2build.h"
    //#include FT_FREETYPE_H  
    #include "freetype/freetype.h" 
    #include "freetype/ftglyph.h"  
    #include  <graphics.h>
    #include "Unicode.h"
    #include <stdlib.h>
    #include "testfont.h"
    
    typedef unsigned short UINT16;
    typedef short	INT16;
    typedef unsigned char UINT8;
    typedef char	INT8;
    typedef unsigned int UINT32;
    typedef int	INT32;
    
    #define	GB_OFFSET_NUMBER	94		//the number of one GB zone.
    #define	GB_MIN_ZONE			0xA0	//min value of the zone number of GB code
    #define	GB_MAX_ZONE			0xF8	//max value of the zone number of GB code
    #define	GB_MIN_OFFSET		0xA1	//min value of the offset number of GB code
    #define	GB_MAX_OFFSET		0xFF	//max value of the offset number of GB code
    #define	MAX_OFFSET_IN_TABLE	8272	//the max offset of the conversion table.
    #define ENLISH_FONT	0
    #define	CHINA_FONT	1
    #define	MAX	50
    
    UINT16	set_font_width = 0;
    UINT16	set_font_higth = 0;
    INT8 PATH_FONT_NAME[MAX];
    UINT32	Ascender;
    
    void initgr(void) 
    { 
    	int gd = DETECT, gm = 0; 
    
    	initgraph(&gd, &gm, "");
    }
    
    int writeAassicToFile( const char *file, const char *path)
    {
    	FILE *fp = NULL;
    	FILE *fp1 =NULL;
    	FT_Library    pFTLib         =  NULL;  
    	FT_Face        pFTFace         =  NULL;  
    	FT_Glyph    glyph;
    	FT_Error    error         =   0 ; 
    	UINT8 buffer[4096];
    	UINT32	header[256];
    	UINT16 count = 0, assic_nu = 0, read_nu, i, j = 0, k;
    	UINT16 m, n;
    	UINT32	address = 0;
    	INT8	name[100];
    	UINT16 Font_w, Font_h;
    	UINT16 start_point = 0;
    
    	if( (fp = fopen(file, "wb")) == NULL ){
    		printf("fail open %s file!", file);
    		return 0;
    	}
    
    #if 1	
    	if( (fp1 = fopen("ASSIC_Info.txt", "w+")) == NULL ){
    		printf("fail open %s file!", file);
    		return 0;
    	}
    #endif
    
    	if( FT_Init_FreeType( & pFTLib) ){  
    		pFTLib  =   0 ;  
    		printf( " There is some error when Init Library " );  
    		return   - 1 ;  
    	}  
    
    	error  =  FT_New_Face(pFTLib,  path ,  0 ,  & pFTFace);
    	if( error ){					
    		printf("fail open %s font file err num : %d \n", path, error);
    		return  -1;
    	}
    	address = 1024;	//存储字符码表的信息	
    
    	FT_Set_Char_Size(pFTFace,  set_font_width * 64 , set_font_higth*64, 72,  72); 
    	Ascender = pFTFace->size->metrics.ascender >> 6; 
    	printf("Vector font %s file running...\n", file);
    	for( k = 0x20; k < 128; k++)
    	{	
    		FT_Load_Glyph(pFTFace, FT_Get_Char_Index(pFTFace,  k), FT_LOAD_DEFAULT);      
    		error = FT_Get_Glyph(pFTFace -> glyph,  & glyph);
    		if(error){
    			printf("fail get %x data info\n", i);
    			return -1;
    		}
    		FT_Glyph_To_Bitmap( & glyph, ft_render_mode_normal,  0 ,  1 );  
    		FT_BitmapGlyph bitmap_glyph  =  (FT_BitmapGlyph)glyph;  
    		FT_Bitmap &bitmap  =  bitmap_glyph -> bitmap; 
    		if (bitmap_glyph->left < 0){
    			bitmap_glyph->left = 0;
    
    		}	
    		header[k] = ((bitmap_glyph->left+bitmap.width)<< 24) | address;
    		Font_w = bitmap.width;
    		Font_h = bitmap.rows;//	dy = Ascender-bitmap_glyph->top;
    		start_point =  (Ascender- bitmap_glyph->top);//Ascender- bitmap_glyph->top
    		if (bitmap_glyph->top < bitmap.rows)
    			start_point -= (bitmap.rows - bitmap_glyph->top)/2 ;
    
    		for( m = 0; m < set_font_higth;  ++m)  //set_font_higth
    		{			
    			for( n = 0; n < (bitmap.width+bitmap_glyph->left);  ++ n){  //set_font_width
    				if(m < start_point) buffer[count++] = 0;
    				else if(m >= start_point +bitmap.rows) buffer[count++] = 0;
    				else{
    					if(n < bitmap_glyph->left)buffer[count++] = 0;
    					else if(n > bitmap_glyph->left+bitmap.width)buffer[count++] = 0;
    					else buffer[count++] = bitmap.buffer[(m - start_point) * bitmap.width + n -bitmap_glyph->left ];
    				}
    				}
    		}
    		fseek( fp, address, SEEK_SET);
    		read_nu = fwrite( buffer, count, 1, fp);
    
    		sprintf(name,"%c address:width: %d height :%d left:%d top:%d %x Ascender:%d\n", k, bitmap.width, bitmap.rows,bitmap_glyph->left,bitmap_glyph->top, address, Ascender);
    		fwrite(name, strlen(name), 1, fp1);
    		address += count;
    		count = 0;
    	
    
    		FT_Done_Glyph(glyph);  
    		glyph  =  NULL;  
    
    	}
    	fclose(fp1);
    	fseek( fp, 0, SEEK_SET);
    	read_nu = fwrite( (UINT8 *)header, 1024, 1, fp);
    	fclose(fp);
    	printf("Generate complete vector fonts\n");
    }
    
    int writeHZToFile( const char *file, const char *path)
    {
    	FILE *fp = NULL;
    	FILE *fp1 =NULL;
    	FT_Library    pFTLib         =  NULL;  
    	FT_Face        pFTFace         =  NULL;  
    	FT_Bitmap bitmap;
    	FT_Glyph    glyph;
    	FT_Error    error         =   0 ; 
    	UINT8 buffer[4096];
    	UINT32	header[256], dx, dy;
    	UINT32 count = 0, assic_nu = 0, read_nu, i, j = 0, k;
    	UINT32 m, n;
    	UINT32	address = 0;	
    	UINT16	offset, ucs2_code;
    	INT8	name[100];
    	INT8 charbuff[3];
    	
    	if( (fp = fopen(file, "wb")) == NULL ){
    		printf("fail open %s file!", file);
    		return 0;
    	}
    #if 1	
    		if( (fp1 = fopen("HZ_Info.txt", "w+")) == NULL ){
    			printf("fail open %s file!", file);
    			return 0;
    		}
    #endif
    
    
    	if( FT_Init_FreeType( & pFTLib) ){  
    		pFTLib  =   0 ;  
    		printf( " There is some error when Init Library " );  
    		return   - 1 ;  
    	}  
    
    	error  =  FT_New_Face(pFTLib,  path ,  0 ,  & pFTFace);
    	if( error ){															// //simhei.ttf
    		printf("fail open %s font file err num : %d \n", path, error);
    		return  -1;
    	}//simfang.ttf
    	FT_Set_Char_Size(pFTFace,  set_font_width * 64 , set_font_higth*64, 72,  72); 
    	Ascender = pFTFace->size->metrics.ascender >> 6; 
    	printf("start write data....\n Ascender:%d\n", Ascender);
    
    	address = 0;
    	printf("Vector font %s file running...\n", file);
    	for(i = GB_MIN_ZONE;i < GB_MAX_ZONE; i++ ){
    		for(j = GB_MIN_OFFSET;j < GB_MAX_OFFSET; j++ ){
    			charbuff[0] = i;
    			charbuff[1] = j;
    			charbuff[2] = '\0';
    			offset = (j - GB_MIN_OFFSET) + (i - GB_MIN_ZONE) * GB_OFFSET_NUMBER;	
    			ucs2_code = (offset < MAX_OFFSET_IN_TABLE) ? gb2312_to_ucs2_table[offset] : 0x00;
    			
    			FT_Load_Glyph(pFTFace, FT_Get_Char_Index(pFTFace,  ucs2_code), FT_LOAD_DEFAULT);
    			if( (error = FT_Get_Glyph(pFTFace -> glyph,  & glyph)) != 0){
    				printf("fail get %x data info\n", i);
    				return -1;	
    			}
    			FT_Glyph_To_Bitmap( & glyph, ft_render_mode_normal,  0 ,  1 );  
    			FT_BitmapGlyph bitmap_glyph  =  (FT_BitmapGlyph)glyph;  
    			bitmap = bitmap_glyph ->bitmap;
    	//		if (bitmap_glyph->left < 0){
    	//		bitmap_glyph->left = 0;
    	//		}
    			dy =Ascender - bitmap_glyph->top;//Ascender - bitmap_glyph->top
    			for( m = 0 ; m < set_font_higth;  m++)  
    			{			
    				for( n = 0 ; n < set_font_width;  n++)
    				{ 
    					if( m <= dy){
    						buffer[count] = 0;
    					}else if( m >= dy +bitmap.rows){
    						buffer[count] = 0;
    					}else {
    						if(n <= bitmap_glyph->left){
    							buffer[count] = 0;
    						}else if( n >= (bitmap_glyph->left + bitmap.width)){
    							buffer[count] = 0;
    						}else{
    							buffer[count] = bitmap.buffer[(m-dy) * bitmap.width + n-bitmap_glyph->left];
    						} 
    					}
    					count++;
    					
    				}
    			}
    
    			fseek( fp, address, SEEK_SET);
    			read_nu = fwrite( buffer, 1, count, fp);
    			sprintf(name,"%s address:width: %d height :%d left:%d top:%d %x Ascender:%d\n", charbuff, bitmap.width, bitmap.rows,bitmap_glyph->left,bitmap_glyph->top, address, Ascender);
    			fwrite(name, strlen(name), 1, fp1);
    	
    			address += read_nu;
    			count = 0;
    			FT_Done_Glyph(glyph);  
    			glyph  =  NULL; 
    		}		
    	}
    	fclose(fp1);
    	fclose(fp);
    	printf("Generate complete vector fonts\n");
    }
    
     int main(int argc, char* argv[])
    {
    	char kind_font = 0;
    	char filename[50];
    	char i, buff[1];
    	char *path = "C:\\Windows\\Fonts\\simhei.ttf";//arial.ttf msyh.ttf simhei.ttf
    	initgr();
    
    	set_font_width =24;
    	set_font_higth = set_font_width;
    	kind_font = ENLISH_FONT;
    	
    	if( kind_font == ENLISH_FONT){
    		sprintf(filename, "ASSIC_%d.bin", set_font_width);
    		printf("filename:%s\n", filename);
    		writeAassicToFile(filename, path); 
    		displayAssic("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.,![]", filename, set_font_higth);
    	}else if( kind_font == CHINA_FONT ){
    		sprintf(filename, "HZ_%d.bin", set_font_width);
    		printf("filename:%s\n", filename);
    		writeHZToFile(filename, path);
    		displaystring("一二三四五六七八九十",filename, set_font_higth);
    	}
    	printf("font width %d height %d\n", set_font_width, set_font_higth);
    	getchar();
    	
      return 0;
    }
    
    #include <stdio.h>
    #include <graphics.h>
    #include <conio.h>
    #include "testfont.h"
    
    #define RGBTranRGB565(x)	((((x) & 0xf80000) >> 19 << 11) | (((x)&0xfc00) >> 10 << 5) | (((x)&0xf8) >> 3)) & 0xffff		//24位的RGB转化为RGB565十六位
    UINT8 data[1024*4];	// 最大45号字体
    
    UINT32	 FontIndexTable[256];
    
    void GetOneCharWidth(char *filename)
    {	FILE *fp = NULL;
    	UINT16 len;
    
    	fp=fopen(filename, "rb");
    	len = fread( (UINT8 *)FontIndexTable,1 ,1024 ,fp );
    //	printf("read %s file head %d bytes!", filename, len);
    	fclose(fp);
    	
    	return ;
    }
    int setcolor(UINT8 apha, UINT32 color ){
    	UINT16 temp;
    	UINT8 R, G, B;
    	UINT32 back_color = 0;
    
    	back_color = getbkcolor();
    //	printf("back_color:%x\n", back_color);
    	R =  GetRValue(back_color) + (GetRValue(color) - GetRValue(back_color))*apha / 255;//( (color & 0xff) + ( (-color + WHITE) & 0xff) * apha / 255) & 0xff;
    	G =  GetGValue(back_color) + (GetGValue(color) - GetGValue(back_color))*apha / 255;//( ((color >> 8)&0xff) + (( (-color + WHITE) >> 8)&0xff) *apha / 255) & 0xff;
    	B =  GetBValue(back_color) + (GetBValue(color) - GetBValue(back_color))*apha / 255;//( ((color  >> 16) &0xff) + (( (-color + WHITE)  >> 16) &0xff) *apha / 255) & 0xff;
    	temp = B << 16 | G << 8 | R;
    
    	return  temp;//RGBTranRGB565(temp)
    }
    
    void DisOneHZ(char *filename, int x, int y, int fontSize, char *hz){
    	UINT32 address = 0;
    	FILE *fp = NULL;
    	UINT16 read_byte_num, i, j;
    	UINT16 counter = 0;
    
    	address = ( ( (hz[0]&0xff) - 0xA0) * 94 + (hz[1] & 0xff) - 0xA1 )*fontSize*fontSize;
    //	printf("address:%x hz[0]: %x hz[1]:%x\n", address, hz[0], hz[1]);
    
    
    	if( (fp = fopen(filename, "rb")) == NULL ){
    		printf("fail open %s file\n", filename);	
    		return ;
    	}
    
    	fseek(fp, address, SEEK_SET);
    	counter = fontSize*fontSize;
    
    	read_byte_num = fread(data, 1,counter,  fp);
    	printf("from %s file read %d bytes\n", filename, read_byte_num);
    
    	for( i = y; i < fontSize + y; i++ ){
    		for( j = x; j < fontSize + x; j++ )
    			putpixel( j, i, setcolor( data[(i - y)*fontSize + (j - x)] , BROWN));
    #if 0
    			if(data[(i - y)*fontSize + (j - x)]){//data[(i - y)*fontsize + (j - x)]){
    				printf("*");
    			}else{
    				printf("-");
    			}
    
    #endif
    	}
    	fclose(fp);
    
    }
    
    void DisOneChar(int x, int y, int fontSize, UINT16 fontwidth, UINT8 c){
    	UINT16  i, j;
    	setcolor(WHITE); 
    	rectangle(x - 2, y, x+fontwidth ,y + fontSize );
    	if( fontwidth > fontSize / 2){
    		printf("char ==> %c fontwidth:%d", c, fontwidth);
    	}
    	for( i = y; i < fontSize + y; i++ ){
    		for( j = x; j <  fontwidth+ x; j++ ){
    			putpixel( j, i, setcolor( data[(i - y)*fontwidth + (j - x)] , LIGHTGREEN));
    	#if 0
    			if(data[(i - y)*fontwidth + (j - x)]){//data[(i - y)*fontsize + (j - x)]){
    				printf("*");
    			}else{
    				printf("-");
    			}
    	#endif
    		}
    	}
    
    }
    void displaystring(char *string, char *name, char size){
    	UINT32 i = 0, j = 0;
    	char temp[3];
    
    	while(*string){
    		if((*string)&0x80){
    			temp[0] = string[0];
    			temp[1] = string[1];
    			temp[2] = '\0';
    			DisOneHZ(name, i, j, size, temp);
    			i += size;
    			if(i > 25*24){
    				i = 0;
    				j += size;
    			}
    			printf("\n");
    			
    			string += 2;
    			continue;
    		}	
    		string += 1;
    	}
    }
    
    void displayAssic(char *str, char *name, char size)
    {	
    	char c = 0;
    	UINT16 i = 20, j = 20;
    	FILE *fp = NULL;
    	UINT32	charaddr, len;
    	int fontwidth;
    
    	GetOneCharWidth(name);
    	while(*str){
    		if( *str < 0x80 ){
    			c = *str;
    
    			if( (fp = fopen(name, "rb")) == NULL ){
    				printf("fail open %s file\n", name);	
    				return ;
    			}
    			charaddr = FontIndexTable[c];
    			fontwidth = (charaddr>>24)&0xff;
    			charaddr &= 0x00ffffff;
    			fseek(fp, charaddr, SEEK_SET);
    			len = fread(data, 1, fontwidth*size,  fp);
    			printf("read %s file %c size %d bytes!", name, c, len);
    			fclose(fp);
    			if( i + fontwidth > 480 ){
    				i = 20;
    				j += size;
    			}
    			DisOneChar(i, j, size, fontwidth, *str);
    			i += size;
    		
    		}
    		str++;
    	}
    }
    

    测试英文显示如下图


                                                      
    测试汉字如下图


    原代码已经上传到cdsn上

     http://download.csdn.net/detail/wangyajietiegu/9542057

    展开全文
  • 矢量字体和像素字体

    千次阅读 2015-06-24 21:57:04
    (Owed by: 春夜喜雨 ... 查看windows/fonts下的字体的话,看到黑体的说明如下 字体名称: 黑体 版本: Version 5.01 Open Type Layout, 已数字签名, TrueType Outlines abcdefghijklmnopqrstuvwxyz
  • 里面有完整的文档和制作所需的全部工具,可以利用该方法制作出windows里的所有字体,而且效果不会失真哦
  • 什么是ttf字体:   字库是输出设备的一个组成部分。由于汉字不同于西方字体,字符集非常庞大,不能用单字节表示,因此postscript level i的rip不能使用汉字,很多西文软件也不支持汉字。 桌面出版系统使用的字库有...
  • 制作自定义图标字体,html引用web字体 1、安装Adobe Illustrator CS6(注:http://www.lookae.com/adobecc/)下载破解安装  2、安装Adobe Photoshop CS6(注:http://www.cncrk.com/downinfo/39089.html)  3...
  • 目录freetypes使用步骤1)包含头文件:2) 初始化库:3)加载face对象:4)设置字体大小5)设置字体位置,以及旋转度数:6)加载字形图像准备矢量字库代码.c.h效果叠加至YUV freetypes FreeType是一个完全开源的、可扩展、可...
  • 矢量字库的剪裁

    千次阅读 2013-10-18 12:30:22
    通常一个矢量汉字字库接近10MB, 太大,而我可能只需要显示某几个特定的汉字而已, 那怎么提取或者剪裁现成的字库呢? 我试过一个国人写的“字库剪裁工具”, 要点好几次鼠标,只支持系统字库,不甚方便。我也试图在...
  • 一款作为“常规”字体显示,一款作为“粗体”显示。两款字体并不一定是同一种,只要你自己看着舒服就行。但是粗体比常规粗是必须的。当然,如果你不这么做我也没办法。 优点:不用对现有字体引擎打补丁、做修改。 ...
  • 1)矢量字体原理 2)使用freetype库实现矢量字体显示 1. 矢量字体原理 将汉字的笔划边缘用直线段描述成封闭的曲线,并将线段各端点的坐标经压缩存储,如下图所示: 由于每个汉字的笔划不一样,从而每个...
  • 修改ttf字体美化显示效果

    千次阅读 2008-01-25 09:59:00
    很多人在使用 linux 做桌面时常常会抱怨字体模糊、破碎变形、英文不好看、没有粗斜体等。在 firefly(台湾) http://firefly.idv.tw/test/Forum.php?Board=1 和 akito(日本) http://www.kde.gr.jp/~akito/xft/ 等...
  • ionic3 更换自带字体图标 (ionicon.ttf)

    千次阅读 2018-01-04 17:38:47
    修改ionic自带字体图标,使用自己需要的图标 [1] 工具:(破解安装自行百度) ... FontLab:编辑字体图标文件(.ttf) [2] 步骤:  (1) UI提供图标eps文件,文件包含所有需要的图标文件    (2) 从项目中
  • 字库 TTC TTF

    千次阅读 2012-01-14 20:53:44
     字库是外文字体、中文字体以及相关字符的电子文字字体集合库,被广泛用于计算机、网络及相关电子产品上。  下面描述几种字库。   二、True Type字库    True Type(简称TT)是由美国Apple公司和Microsoft...
  • 上次发布了一篇直接用CorelDRW制作字体文件的文章,但是CorelDRW毕竟只是一个设计 软件,对于它制作字体 文件应付一般的应用是没有问题的,如果要制作更专业点的字体就需要配合其他的软件使用了,一个好汉三个帮...
  • 我们在日常需求中,经常会碰到视觉设计师对某个中文字体效果非常坚持的情况,因为页面是否高大上,字体选择是很重要的一个因素,选择合适的字体可以让页面更优雅。面对这种问题,我们通常以下方式来进行设计还原:...
  • 然,对于嵌入式系统,不太可能使用矢量字体,在这种情况卜,点阵 字体就显现出了它的优点。 本软件可以在WINDOWS系统卜生成任意点阵大小的ASCII, GB2312(简体中文)、GBK(简体中文)、BIGS(繁体中文)、HANGUL(韩 文)...
  • iconfont.cn这个网站有大量的图片可供选择,可以根据自己的需求去下载一些图标,具体使用方式可以参考这篇文章...我想要使用ttf格式,点击下载素材,发现没有这个格式,后来通过下载代码,找到了这个格式,如图所示: ...
  • x2ttf,涂鸦造字,又名bmp2ttf,是一款功能强大、操作简单的“傻瓜式”、批量化truetype字库制作软件 普通用户,仅需对照字模图片,直接覆盖或修改,即可全自动、批量化,将字库图片,转换为标准的truetype字库文件...
  • iconfont字体图标四中制作方法

    千次阅读 2017-06-26 11:57:00
    使用矢量图形编辑器设计图标,画布最好设为512px*512px。以Adobe Illustrator为例,保存为svg格式时会弹出一个svg图片属性设置对话框。这时候请按下图设置选项: 上图来自Filament Group 步骤二 将svg...
  • 字体名称:Mooretronics 详细介绍:https://blog.csdn.net/MobiuX/article/details/89886624
  • 第32章 emWin6.x的矢量字体(支持汉字全字库,Unicode编码,QSPI Flash方案) 本期教程跟大家讲解矢量字体的相关知识,矢量字体最大的好处就是可以任意放大或者缩小字体,而且字体的显示效果不失真。矢量字体也有...
  • 阿里巴巴矢量项目图标制作流程

    千次阅读 2015-04-24 18:06:19
    点击图标管理->上传图标->查看帮助->点击图标制作模板链接下载模板->打开AI制作->ps图层复制到ai,(Ctrl+c Ctrl+v shift等比缩放)->制作完成->文件存储为svg格式->选项:字体文字选择svg 图像位置为嵌入->上传 ...
  • 2018的第一个月份,希望能多记录一些实用的东西吧,今天来分享一下Android中的矢量图(SVG)的用法,我首先会说一下矢量图的基本使用方法,然后说一下阿里巴巴矢量图标库Iconfont的使用,最后会通过一个开源库的学习...
  • SVG - 在Android中使用矢量图全攻略

    千次阅读 2019-07-02 22:20:07
    什么是矢量图,SVG SVG全称:可伸缩矢量图形 (Scalable Vector Graphics) SVG 用来定义用于网络的基于矢量的图形 SVG 使用 XML 格式定义图形 SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失 SVG 是万维网...
  •  参考这篇文章: http://blog.csdn.net/ghostwriter/archive/2006/07/11/906260.aspx QT/E程序可以直接使用TTF矢量库,但是效率不高,而且体积过大。所以有必要制作QT专用的QPF库,下面做一简单介绍:1) 必备

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 994
精华内容 397
关键字:

ttf矢量字体制作