初探freetype字体库

文字的显示依赖于字体字库,大致的字体字库分为点阵字库、笔画字库和轮廓字库。

点阵字库:缺点比较明显,缩放存在锯齿,渲染旋转等操作相对复杂,且效果不理想,先大多用在嵌入式行业(基本抛弃),常见格式有bdf,pcf,fnt,hbf,hzf等。

笔画字体:不讨论。

轮廓字体:即矢量字体,利用字体轮廓及填充实现字体显示,优势明显,渲染缩放较容易,但效率相对低些(相对于嵌入式)

 

简单来说,freetype为字体字库提供了一套解决方案,支持文字字体渲染等操作,主要还是其为C语言编写,跨平台,为很多不支持矢量字体格式的嵌入式系统提供使用嵌入式字体的可能,且效率不低。

基本流程为:
加载字体字库文件-> 查找待显示的文字索引-> 渲染操作(若反走样处理)->处理为位图数据->显示

freetype官网http://freetype.sourceforge.net/index2.html

下面为在XP下显示中文字体的实例,在官方下载源码,在..\freetype-2.4.2\builds\win32\vc2008\下打开工程,编译为链接库,新建VS2008的MFC程序,加载freetype242.lib库。

 

简单考虑,直接在MFC中的draw函数中画出一个中文汉字。便于显示,使用GDI+画出汉字,因此首先对GDI+进行初始化等操作(GDI+的相关知识不讨论,不清楚可以留言或索取GDI+文档,网上也可以搜搜)

在view.h中添加头文件声明

 

1
2
#include <ft2build.h>
#include FT_FREETYPE_H

 

在view.h中添加成员变量

 

1
2
3
public :
     FT_Library library;
     FT_Face face;

 

 

在view.cpp的构造函数中添加

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 初始化库
bool bError = FT_Init_FreeType(&library);
if (!bError)
{
// 是否初始化成功
}
// 加载一个字库文件,这里为黑体中文字库
bError = FT_New_Face(library,
"C:\\WINDOWS\\Fonts\\simhei.ttf" ,
0, &face);
if (bError == FT_Err_Unknown_File_Format)
{
// 表示可以打开和读此文件,但不支持此字体格式
}
else if (bError)
{
// 其他错误
}
// 设定为UNICODE,默认也是
  FT_Select_Charmap(face,FT_ENCODING_UNICODE);
  // 设定字体字符宽高和分辨率
bError = FT_Set_Char_Size(face, 0, 16*64, 300, 300);

 

 

在::OnDraw(CDC* pDC)中添加代码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool bError;
wchar_t wChar= _T( '博' );
// 查找‘好’的字符索引
FT_UInt glyph_index = FT_Get_Char_Index(face, wChar);
// 装载字型图像到字形槽
bError = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
 
 
// 转换为位图数据
if (face->glyph->format != FT_GLYPH_FORMAT_BITMAP)
{
// 第二个参数为渲染模式,这里渲染为1位位图(黑白位图),若为FT_RENDER_MODE_NORMAL则渲染为256级灰度图
bError = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_MONO);
}

 

 

这里便可以通过face->glyph->bitmap获得字体“博”的位图数据了,bitmap中存放了如位图的宽高、色深,调色板等信息,便可以通过GDI+绘制该图像了 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//创建位位图
BITMAPINFO bmpinfo = {0};
// 初始化位图结构体
bmpinfo.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
bmpinfo.bmiHeader.biWidth = face->glyph->bitmap.width;
bmpinfo.bmiHeader.biHeight = face->glyph->bitmap.rows;
bmpinfo.bmiHeader.biBitCount = 1; // 与渲染模式有关,详见FreeType API手册的FT_Bitmap部分说明
bmpinfo.bmiHeader.biClrImportant = 0;
bmpinfo.bmiHeader.biClrUsed = 0;
bmpinfo.bmiHeader.biCompression = BI_RGB;
bmpinfo.bmiHeader.biPlanes = 1;
bmpinfo.bmiHeader.biSizeImage = 0;
 
 
// 创建内存位图
unsigned char *pvBits = new unsigned char [10000];
HBITMAP hBitmap =CreateDIBSection(NULL, &bmpinfo, DIB_RGB_COLORS, ( void ** )&pvBits, NULL, 0 );
 
int iLineBytes = (bmpinfo.bmiHeader.biWidth + 7) / 8;
for ( int i = 0; i != bmpinfo.bmiHeader.biHeight; ++i)
{
memcpy (pvBits + i * iLineBytes, face->glyph->bitmap.buffer + i * iLineBytes, iLineBytes);
}
 
Bitmap *pBitmap = Bitmap::FromHBITMAP(hBitmap, NULL);
Graphics graphic(pDC->m_hDC);
graphic.DrawImage(pBitmap, Point(20, 150));

 

 

这部分代码不多解释,只是显示位图数据,这里face->glyph->bitmap是没有调色板的1位位图,源于使用FT_RENDER_MODE_MONO渲染模式

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeType是一个开源的字体渲染库,它提供了一套功能强大的API,用于加载、解析和渲染字体文件。使用FreeType库,您可以在应用程序中实现高质量的字体渲染。 以下是使用FreeType库加载和渲染字体的基本步骤: 1. 下载和安装FreeType库:您可以从FreeType官方网站(https://www.freetype.org)下载库文件,并按照文档进行安装。 2. 引入头文件和链接库:在您的项目中引入FreeType的头文件和链接库。具体的引入方式会根据您使用的编程语言和开发环境而有所不同。 3. 初始化FreeType库:在使用FreeType之前,需要调用FT_Init_FreeType函数来初始化FreeType库。 4. 加载字体文件:使用FT_New_Face函数加载字体文件。您需要提供字体文件的路径,并指定要加载的字体索引(如果字体文件包含多个字体)。 5. 设置字体大小:使用FT_Set_Pixel_Sizes函数或FT_Set_Char_Size函数设置字体的大小。 6. 渲染字符:使用FT_Load_Char函数加载要渲染的字符,并使用FT_Render_Glyph函数将字符渲染为位图。 7. 获取位图数据:通过FT_GlyphSlot结构体中的bitmap成员获取位图数据。 8. 绘制位图:将位图数据绘制到屏幕或纹理上,以实现字体渲染效果。 9. 释放资源:在使用完FreeType库后,需要调用相应的清理函数来释放资源,例如FT_Done_Face和FT_Done_FreeType。 请注意,以上仅为使用FreeType库的基本步骤,具体的实现方式会根据您的需求和编程语言而有所不同。您可以参考FreeType库的文档和示例代码,以及相关编程语言的FreeType库绑定或封装库的使用指南,来更详细地了解和应用FreeType库。 希望这些信息对您有所帮助!如果您有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值