HI35xx平台:FreeType2使用总结

一、FreeType2简介

  1. 是一个免费、开源、可移植且高质量的字体引擎;

  2. 支持多种字体格式文件,并提供了统一的访问接口;

  3. 支持单色位图、反走样位图渲染,这使字体显示质量达到Mac的水平;

  4. 采用面向对象思想设计,用户可以灵活的根据需要裁剪。

二、FreeType2字形约定

2.1 基本概念

字形:

字符映像叫做字形,单个字符能够有多个不同的映像,即多个字形。多个字符也可以有一个字形。
(可以理解为一个字形就是一种书写风格)

字符图:

字体文件包含一个或多个表,叫做字符图。用来将某种字符码转换成字形索引。一种字符编码方式(如ASCII、Unicode、Big5)对应一张表。

2.2字形轮廓

点:

字形文本的大小通常用点(point)表示。点是一种简单的物理单位,数字印刷中,一点等于1/72英寸。
设备的分辨率通常使用dpi(每英寸点数)表示的两个数。
点数大小和像素数的转换公式: 像素大数 = 点数*分辨率/72

轮廓线:

字形轮廓的源格式是一组封闭的路径,称为轮廓线。每个轮廓线划定字形的外部或内部区域,它们可以是线段或者Bezier曲线。

EM正方形:

字体在创建字形轮廓时,字体创建者所使用的假象的正方形。他可以将此想象成一个画字符的平面。它是用来将轮廓线缩放到指定文本尺寸的参考;它的尺寸越大,可以达到更大的字形分辨率。
注意:字形可以自由的超出EM正方形。

位图渲染:

指从字形轮廓转换成一个位图的过程。

2.3 字形度量

基线、笔和布局:

基线是一个假象的线,用来在渲染文本时知道字形,它可以是水平或垂直的。而且,为了渲染文本,在基线上有一个虚拟的点,叫做笔位置或原点,它用来定位字形。每种布局使用不同的规约来放置字形:

对水平布局,字形简单地搁在基线上;

对于垂直布局,字形在基线上句中放置。

在这里插入图片描述

                     图1. 水平布局及其度量    

在这里插入图片描述

          图2.垂直布局及其度量

重要的字体度量参数

上下高度(ascent): 从基线到放置轮廓点最高(上)的距离;
下行高度(descent):从基线到放置轮廓点最低(下)的距离;
左跨距(bearingX): 从当前笔位置到轮廓左边界的水平位置;
上跨距(bearingY): 从当前笔位置到轮廓上边界的垂直位置;
步进宽度(advanceX): 相邻两个笔位置的水平距离(字间距);
字形宽度(width): 字形的水平长度;
字形高度(height): 字形的垂直长度。

三、FreeType2基本数据结构及API

3.1 基本数据结构

在这里插入图片描述
FT_Library(库对象)
FreeType库句柄对象

(不用关心其成员)

FT_Face(外观对象)
成员:

num_faces: 字体文件所含外观数

face_index: 当前外观索引值

num_glyphs: 当前外观所含字形文件数

num_charmaps: 字符表数

charmaps: 字符表数组

charmap: 当前字符表

glyph:  字形槽对象

size:  字形尺寸

FT_Size(尺寸对象)
成员:

face:  指向父对象(FT_Face对象)

metrics:  字形尺寸对象

FT_Size_Metrics(EM度量对象)

成员:

x_ppem: EM正方形水平像素数

y_ppem: EM正方形垂直像素数

ascender:  EM正方形上行距离

descender: EM正方形下行距离

height:  EM正方形高度

max_advance: 最大步进宽度

FT_GlyphSlot(字形槽对象)
成员:

face:  指向父对象(FT_Face对象)

metrics:  字形尺寸对象

advance:  步进对象

format:  字形槽格式

bitmap:  字形位图

bitmap_top: 位图上行距离

bitmap_left: 位图左行距离

outline:  字形轮廓线

FT_Vector(步进向量)
成员:

x:  水平步进值

y:  垂直步进值

FT_Bitmap(字形位图对象)
成员:

row:  位图行数(高度)

width:  位图宽度

buffer:  位图数据(默认8位灰度值)

FT_Glyph_Metrics(字形槽度量对象)
成员:

width:  字符映像宽度

height:  字符映像高度

horiBearingX: 左跨距(水平布局)

horiBearingY: 右跨距(水平布局)

horiAdvance: 水平步进

vertBearingX: 左跨距(垂直布局)

vertBearingY: 右跨距(垂直布局)

vertAdvance: 垂直步进
3.2 基本API
FT_ErrorFT_Init_FreeType(FT_Library *alibrary):

函数功能:
	实例化一个FreeType库对象,并返回给alibrary;

返回值:
	若实例化成功则返回0
FT_ErrorFT_Done_FreeType(FT_Library library):

函数功能:
	销毁FreeType库对象library,包括其所有子对象;
FT_ErrorFT_New_Face(FT_Library library, const char*filepathname, FT_Longface_index,FT_Face*aface ):

函数功能:
	打开filepathname所指定的字体文件,加载第index个字体外观,并返回给aface指定的地址。
FT_ErrorFT_Set_Char_Size(FT_Face face, FT_F26Dot6 char_width,  FT_F26Dot6 char_height, FT_UInthorz_resolution,FT_UIntvert_resolution ):

函数功能:
	设置字体大小;

输入参数:

	char_width:1/64点为单位的字符宽度;
	
	char_height:1/64点为单位的字符高度;
	
	horz_resolution: 设备水平分辨率;
	
	vert_resolution: 设备垂直分辨率。

注意:

	字符宽度或高度可设置为0,这意味着宽度或高度与另一个参数(高度或宽度)相同;
	
	水平或垂直分辨率设置为0时表示使用默认的72dpi。
FT_UIntFT_Get_Char_Index(FT_Face face, FT_ULong charcode):

函数功能:
	在选定的字符表中,查找与给出的字符码对应的字形索引。

返回值:

	如果没有字符表被选中,这个函数简单返回字符码;

	如果该字符表总没有该字符码对应的字形图像,返回0。

注意: 

	0对应特殊的字符图像,通常会显示一个框或空格;

	新建一个face时,默认是Unicode编码的字符表。
FT_Error  FT_Load_Glyph( FT_Face face, FT_UInt  glyph_index, FT_Int32load_flags):

函数功能:
	从face中装载第index个字形图像到字形槽中(face->glyph)。

输入参数:

	load_flags:装载标志,默认FT_LOAD_DEFAULT。此时优先装载嵌入位图,若无,则装载该字形的缩放后的轮廓线。
	
	face->glyph->format描述了字形图像的格式。若它的值是FT_GLYPH_FORMAT_OUTLINE,则可调用FT_Outline_Embolden加粗轮廓线;若它的值不是FT_GLYPH_FORMAT_BITMAP,则可通过FT_Render_Glyph把它转换成位图。
FT_Error FT_Outline_Embolden(FT_Outline* outline,FT_Pos strength):
函数功能:

	将轮廓线加粗strength(26.6像素格式)
FT_Error FT_Render_Glyph(FT_GlyphSlot slot,FT_Render_Moderender_mode):

函数功能:
	将字形槽对象(slot)中的字形图像转换成字形位图。

输入参数:

render_mode:渲染模式位标志集合,默认使用

FT_RENDER_MODE_NORMAL渲染模式,表示渲染为一个高质量的抗锯齿(256级灰度)位图。

四、示例

int main()
{
	FT_Library	library;
	FT_Face		face;
	FT_Error	error;
	FT_UInt		charIdx;
	wchar_t		wch = 'a';
	char*		buffer;		// 用户申请的显示区域空间
	int			startX, startY;	// 字符图像开始装入的位置
 
	// 1. 初始化freetype2库
	error = FT_Init_FreeType(&library);
 
	// 2. 创建一个face
	error = FT_New_Face(library, "C:\\windows\\font\\SURSONG.TTF", 0, &face);
 
	// 3. 设置字体尺寸
	error = FT_Set_Char_Size(face, 16*64, 16*64, 96, 96);
 
	// 4. 获取字符图像索引
	charIdx = FT_Get_Char_Index(face, wch);
 
	// 5. 加载字符图像
	FT_Load_Glyph(face, charIdx, FT_LOAD_DEFAULT);
	if (face->glyph->format == FT_GLYPH_FORMAT_OUTLINE)
	{
		FT_Outline_Embolden(&(face->glyph->outline), 16);	// 加粗轮廓线
	}
 
	// 6. 获取字符位图
	if (face->glyph->format != FT_GLYPH_FORMAT_BITMAP)
	{
		FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
	}
 
	// 7. 拷贝字符位图到用户的buffer中(用户私人函数)
	// 注意左边的计算方法
	ft2CopyBitmapToBuf(buffer, startX+face->glyph->bitmap_left,
		startY+face->size->metrics.ascender/64-face->glyph->bitmap_top,
		face->glyph->bitmap);
	startX += face->glyph->advance.x/64;
}

转载:https://blog.csdn.net/finewind/article/details/38009731

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cv::freetype是OpenCV库中的一个模块,用于在图像上添加文字。引用和引用提供了两种使用cv::freetype的方法。 第一种方法是通过包含OpenCV中的freetype头文件并初始化字体来使用。您可以使用cv::freetype::createFreeType2()创建一个字体对象,然后使用loadFontData()方法加载字体数据。接下来,可以使用putText()方法将文字添加到图像上,指定文本内容、位置、大小、颜色等参数。 第二种方法是需要自己安装freetype库。您可以使用cv::freetype::createFreeType2()创建一个字体对象,然后使用loadFontData()方法加载字体文件的路径。接下来,可以使用putText()方法将文字添加到图像上,指定文本内容、位置、大小、颜色等参数。 请根据您的实际需求选择适合您的方法来使用cv::freetype模块。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [opencv图片上写中文](https://blog.csdn.net/small_planet/article/details/128807809)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [opencv3.4.14(带freetype)](https://download.csdn.net/download/qq_31629063/87016402)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值