[TTF字体]提取TTF字体的轮廓(一)

转自:https://blog.csdn.net/cay22/article/details/12005517

一. 相关结构

TrueType Font ,由Apple和微软公司合作推出的文字文件格式. 一个TTF字符由许多轮廓组成,每一个轮廓由一个名叫TTPOLYGONHEADER的数据结构开始,跟在TTPOLYGONHEADER后面的是一系列的TTPOLYCURVE数据结构体。轮廓的顶点是POINTFX类型的数据结构点.

TTPOLYGONHEADER的结构如下:

typedef struct _TTPOLYGONHEADER {   
  DWORD   cb;						// 描述字符要求的字节数(1个TTPOLYGONHEADER 和所有TTPOLYCURVE字节和) 
  DWORD   dwType;					// 指定返回的字符轮廓类型, 固定为TT_POLYGON_TYPE  
  POINTFX pfxStart;					// 指定字符轮廓的起点   
} TTPOLYGONHEADER, *LPTTPOLYGONHEADER;  

TTPOLYCURVE的结构如下:

typedef struct tagTTPOLYCURVE {   
  WORD    wType; 				// 指定描述字符轮廓的线类型: TT_PRIM_LINE, TT_PRIM_QSPLINE, TT_PRIM_CSPLINE   
  WORD    cpfx;  				// 指定结构中含有POINTFX的个数  
  POINTFX apfx[1]; 				// 指定字体中保留的polyline和Bzier spline  
} TTPOLYCURVE, *LPTTPOLYCURVE;  

TT_PRIM_LINE(直线), TT_PRIM_QSPLINE(二次贝塞尔曲线), TT_PRIM_CSPLINE(三次贝塞尔曲线)

POINTFX的结构如下:

typedef struct tagPOINTFX {   
  FIXED x; // x-component of a point on the outline of a TrueType character   
  FIXED y; // y-component of a point on the outline of a TrueType character  
} POINTFX, *LPPOINTFX;   
typedef struct _FIXED { 
  WORD  fract; // Specifies the fractional part of the number.
  short value; // Specifies the integer part of the number.
} FIXED; 
The FIXED structure is used to describe the elements of the MAT2 structure. 

GLYPHMETRICS的结构如下:

typedef struct _GLYPHMETRICS {   
  UINT  gmBlackBoxX;     	// 指定完全包围字体结构的最小矩阵的宽度   
  UINT  gmBlackBoxY;     	// 指定完全包围字体结构的最小矩阵的高度  
  POINT gmptGlyphOrigin; 		// 指定完全包围字体结构的最小矩阵左上角的点坐标  
  short gmCellIncX;      		// 指定当前的起点到下一个字符的起点的水平距离  
  short gmCellIncY;      		// 指定当前的起点到下一个字符的起点的垂直距离   
} GLYPHMETRICS, *LPGLYPHMETRICS;   

通过下图,可以很明确的理解GLYPHMETRICS结构:

结构GLYPHMETRICS的使用主要在API函数GetGlyphOutline()来保存字符单元在字形的位置.

DWORD GetGlyphOutline(
	UINT nChar,       		// 需要获取字符
	UINT nFormat,     		// 获取字符的格式
	LPGLYPHMETRICS lpgm,	// 获取字符的相关信息
	DWORD cbBuffer,			// 保存字符数据缓冲区的大小
	LPVOID lpBuffer,			// 保存字符数据的缓冲区
	const MAT2* lpmat2 		// 变换矩阵
)const;

参考:

http://blog.csdn.net/kingstar158/article/details/7191416

http://blog.csdn.net/kingstar158/article/details/7193097

http://blog.csdn.net/kingstar158/article/details/7257347

二. 内存结构说明

 

 

2.1 一个字符的轮廓是由n个轮廓数据组成的(我这里叫轮廓为Outline)

 

|-----------------------------------|

|  1. Outline                           |

|-----------------------------------|

|  2. Outline                           |

|-----------------------------------|

|  ...                                         |

|-----------------------------------|

|  n. Outline                           |

|-----------------------------------|

大小是 GetGlyphOutlineW的返回值.

 

 

 

2.2 其中一个Outline的内存结构是这样的

 

|-------------------------------------------|

|  1. TTPOLYGONHEADER          |

|-------------------------------------------|

|  2. TTPOLYCURVE                     |

|-------------------------------------------|

|  ...                                                    |

|-------------------------------------------|

|  n. TTPOLYCURVE                     |

|-------------------------------------------|

大小是TTPOLYGONHEADER.cb指定

typedef struct _TTPOLYGONHEADER {   
  DWORD   cb;					// 指定该Outline轮廓的字节数(1个TTPOLYGONHEADER 和所有TTPOLYCURVE字节和) 
  DWORD   dwType;			    // 指定该Outline轮廓类型, 固定为TT_POLYGON_TYPE  
  POINTFX pfxStart;			    // 指定该Outline轮廓的起点   
} TTPOLYGONHEADER, *LPTTPOLYGONHEADER;
 
typedef struct tagTTPOLYCURVE {   
  WORD    wType; 				// 指定描述字符轮廓的线类型: TT_PRIM_LINE, TT_PRIM_QSPLINE, TT_PRIM_CSPLINE   
  WORD    cpfx;  				// 指定结构中含有POINTFX的个数  
  POINTFX apfx[1]; 				// 指定字体中保留的polyline和Bzier spline  
} TTPOLYCURVE, *LPTTPOLYCURVE; 

2.3 其中一个TTPOLYCURVE的内存结构是这样的

 

|----------------------------------------|

|  WORD    wType;                      |

|----------------------------------------|

|  WORD    cpfx;                           |

|----------------------------------------|

|  1. POINTFX                               |

|----------------------------------------|

|  2. POINTFX                              |

|----------------------------------------|

|  ...                                                |

|----------------------------------------|

|  n. POINTFX                              |

|----------------------------------------|

其中这里的n就是cpfx指定

其中 POINTFX:

typedef struct tagPOINTFX
{
    FIXED x;
    FIXED y;
} POINTFX, FAR* LPPOINTFX;

x, y就是点的坐标, 需要这样转换为int

int CHYTTFCharacter::FIXEDToInt(FIXED& fixed)
{
    if (fixed.fract >= 0x8000)
		return(fixed.value + 1);
    else
		return(fixed.value);
}

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iFonts字体助手是一款非常实用的字体提取工具,通过该工具,用户可以方便地提取TTF字体文件。TTF字体是TrueType Font字体的缩写,是一种常见的字体文件格式,它可以被广泛应用于各种领域,如数字印刷、书籍排版、广告设计、网页制作等等。 在使用iFonts字体助手提取TTF字体文件时,用户只需要先下载并安装该软件,然后在界面中选择需要提取字体文件,点击“提取文件”按钮即可完成操作。在提取过程中,软件会自动解压TTF字体文件,并将其保存在提取目录中。 通过iFonts字体助手提取TTF字体文件的好处是非常明显的,它能够让用户轻松获取需要的字体文件,并用于各种设计和排版工作中。而且该工具简单易用,几乎不需要任何专业知识和技能,就可以完成字体提取的任务。因此,对于需要大量使用TTF字体的用户来说,iFonts字体助手是一款非常值得推荐的小工具。 ### 回答2: iFonts字体助手是一款功能强大的字体管理工具,其中一个主要的功能就是可以提取ttf字体ttf字体是TrueType字体的缩写,它是一种常见的数字字体格式,通常用于电脑和手机上的字体显示。 通过iFonts字体助手提取ttf字体,可以使用户在需要时轻松获取所需字体,并且方便地将其应用于不同的设计项目中。具体操作方法如下: 1. 首先,在iFonts字体助手中搜寻需要提取字体,可以输入关键字或者直接浏览字体列表。 2. 在选定字体后,点击iFonts字体助手中的“ttf提取”按钮。 3. 接着,选择需要提取字体,以及要保存的位置,即可完成字体提取。 4. 提取后的ttf字体文件可以随时在电脑上使用,也可以通过云路由进行在手机上的保存和使用。 总之,通过iFonts字体助手提取ttf字体,用户可以轻松获取所需字体,并且使字体应用更加便捷和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值