freetype使用详解,freetype python
一、FreeType2简介
1.它是一个免费、开源、可移植的高质量字体引擎;
2.支持多种字体格式文件,提供统一的访问接口;
3.支持单色位图和抗锯齿位图渲染,使字体显示质量达到Mac的水平;
4.采用面向对象的设计,用户可以根据需要灵活裁剪。
二、FreeType2字形约定
2.1基本概念
字形:
图像称为字形,一个字符可以有多个不同的图像,即多个字形。多个字符也可以有一个字形。
(可以理解为一个字形就是一种书写风格)
字符映射表:
字体文件包含一个或多个表格,这些表格被称为字符图。用于将字符代码转换为字形索引。一种字符编码方法(如ASCII、Unicode、Big5)对应一个表。
2字形轮廓
要点:
字形文本的大小通常用一个点来表示。点是一个简单的物理单位。在数字印刷中,一个点等于1/72英寸。
设备的分辨率通常使用两个以dpi(每英寸点数)表示的数字。
网点大小与像素数的换算公式:
像素数=点数*分辨率/72
等高线:
字形的源格式是一组封闭的路径,称为轮廓。每个轮廓定义了字形的外部或内部区域,它可以是线段或贝塞尔曲线。
EM正方形:
字体创建者在创建字体轮廓时使用的假正方形。他可以把它想象成一个画人物的平面。它是将轮廓缩放到指定文本大小的参考;它的尺寸越大,字体分辨率就越高。
注意:字体可以自由超出EM方块。
位图渲染:
是指将字形轮廓转换为位图的过程。
2.3字形测量
基线、笔和布局:
基线是一条假想的线,用来在渲染文本时知道字形。它可以是水平的,也可以是垂直的。而且为了渲染文字,基线上有一个虚拟点,叫做笔位或者原点,用来定位字形。每种布局使用不同的约定来放置字形:
对于水平布局,字形简单地放置在基线上;
对于垂直布局,字形放在句子中基线的上方。
图一。平面布局及其测量
图二。垂直布局及其测量
重要的字体度量参数:
上升:从基线到轮廓点最高(上)位置的距离;下降:从基线到放置轮廓最低点的距离;BearingX:从当前笔位置到轮廓左边界的水平位置;BearingY:从当前笔位置到轮廓上边界的垂直位置;AdvanceX width:两个相邻笔位之间的水平距离(字间距);字形宽度:字形的水平长度;字形高度:字形的垂直长度。
三、FreeType2基本数据结构及API
3.1基本数据结构
FT_Library: FreeType库句柄对象
(不关心其成员)
FT_Face(皮肤对象):成员:
Num_faces:字体文件中包含的面数
Face_index:当前外观索引值
Num_glyphs:当前外观中包含的字形文件的数量
Num_charmaps:字符表的数量
Charmaps:字符表数组
Charmap:当前字符表
字形:字形槽对象
大小:字体大小
FT_Size:成员:
面:指向父对象(FT_Face对象)
度量:字体大小对象
FT_Size_Metrics(EM测量对象):
成员:
x _ ppem:em正方形的水平像素数
y _ ppem:em正方形的垂直像素数
上升器:EM平方上行距离
下降:EM平方下降距离
高度:EM方形高度
Max_advance:最大步长
FT_GlyphSlot(字形槽对象):成员:
面:指向父对象(FT_Face对象)
度量:字体大小对象
前进:步进对象
格式:字体槽格式
位图:字体位图
位图_顶部:位图上行距离
Bitmap_left:位图的左线距离
轮廓:字形轮廓
FT_Vector(步长向量):成员:
x:水平步长值
y:垂直步长值
FT_Bitmap(字形位图对象):成员:
Row:位图行数(高度)
宽度:位图宽度
缓冲区:位图数据(默认8位灰度值)
FT_Glyph_Metrics(字形槽测量对象):成员:
宽度:字符图像的宽度
Height:字符图像的高度
水平x:左侧跨度(水平布局)
水平:右跨度(水平布局)
水平前进:水平步进
VertBearingX:左跨度(垂直布局)
垂直方向:右跨度(垂直布局)
垂直步进
3.2基本API
ft _ error ft _ init _ freetype(ft _ library * a库):function函数:
实例化一个FreeType库对象并将其返回给一个library;
返回值:
如果实例化成功,将返回0。
FT _ ERROR FT _ DONE _ FREEType(FT _ LIBRARY库):Function函数:
销毁FreeType库对象库,包括其所有子对象;
FT _ error FT _ New _ Face(FT _ library library,const char* filepathname,FT_Longface_index,FT_Face*aface):
功能函数:
打开filepathname指定的字体文件,加载索引字体外观,并将其返回到aface指定的地址。
FT _ error FT _ Set _ Char _ Size(FT _ face face face,FT_F26Dot6char_width,FT_F26Dot6char_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_ULongcharcode):
功能函数:
在所选字符表中,查找对应于给定字符代码的字形索引。
返回值:
如果没有选择字符表,这个函数只是返回字符代码;
如果字符表中没有字符码对应的字形图像,则返回0。
注意:
0对应特殊字符图像,通常显示一个方框或空格;
创建新面孔时,默认为Unicode编码的字符表。
FT _ error FT _ Load _ Glyph(FT _ face face,FT_UInt glyph_index,FT_Int32load_flags):
功能函数:
将索引字形图像从face加载到字形槽(face-glyph)。
输入参数:
Load_flags:加载标志,默认FT_LOAD_DEFAULT。此时,优先加载嵌入的位图,否则加载字形的缩放轮廓。
字形格式描述了字形图像的格式。如果它的值是FT_GLYPH_FORMAT_OUTLINE,可以调用ft _ outline _ emblden加厚轮廓;如果它的值不是FT_GLYPH_FORMAT_BITMAP,可以通过FT_Render_Glyph转换成位图。
FT _ ERROR FT _ OUTLINE _ ember en(FT _ OUTLINE * OUTLINE,FT _ POSSTRENGTH): Function函数:
使轮廓加粗、加强(26.6像素格式)。
ft _ error ft _ render _ glyph(ft _ glyph slot,ft _ render _ mode):function函数:
将字形槽对象中的字形图像转换为字形位图。
输入参数:
Render_mode:渲染模式的位标志集,默认使用。
FT_RENDER_MODE_NORMAL渲染模式意味着渲染是高质量抗锯齿(256级灰度)位图。
[cpp]查看普通副本int main(){ FT _ library库;FT _ facefft _ error error FT _ UIntcharIdxwchar _ twch= achar *缓冲区;//用户申请的显示区域空间intstartX,startY//字符图像开始装入的位置//1.初始化自由类型2库error=FT_Init_FreeType(库);//2.创建一个faceerror=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 _ boled en((face-GLYPH-OUTLINE),16);//加粗轮廓线}//6.获取字符位图如果(面-字形-格式!=FT _ GLYPH _ FORMAT _ BITMAP){ FT _ Render _ GLYPH(face-GLYPH,FT _ Render _ MODE _ NORMAL);}//7.拷贝字符位图到用户的缓冲器中(用户私人函数)//注意左边的计算方法ft2CopyBitmapToBuf(buffer,startX face-glyph-bitmap_left,startY face-size-metrics。ascender/64-face-glyph-bitmap _ top,face-glyph-bitmap);startX=面-字形-前进。x/64;} 转载于:https://www。cn博客。com/CHD-张博/p/5671798.html
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。