freetype使用详解,freetype python

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: