嵌入式 初探freetype字体库

原创 2013年12月02日 14:52:16

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

点阵字库:缺点比较明显,缩放存在锯齿,渲染旋转等操作相对复杂,且效果不理想,先大多用在嵌入式行业(基本抛弃),常见格式有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
#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渲染模式

 

显示预览

freetype2 开发手册

《FreeType Glyph Conventions》中译版 FreeType字形约定 一、基本印刷概念 1、字体文件、格式和信息 字体是一组可以被显示和打印的多样的...
  • zxwangyun
  • zxwangyun
  • 2012年12月19日 10:52
  • 1073

嵌入式 Linux下利用FreeType2的API实现字符的显示

网上的FreeType2例子太少,能显示汉字的比较难找,C语言代码写的更难找,能找到的,基本上是被转载了N遍的同一个示例代码,基本上解决不了我的问题。 于是乎,花费了不少时间才完成了这些代码; 主要功...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:52
  • 853

使用FreeType绘制字体

不带缓存的FreeType使用   1、 初始化库   FT_Init_FreeType( FT_Library  *alibrary );   2、 通过创建一个新的 face 对...
  • furtherchan
  • furtherchan
  • 2013年03月13日 12:55
  • 7463

FreeType字体程序库介绍

『FreeType简介』 FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, ...
  • ganxingming
  • ganxingming
  • 2006年06月05日 20:57
  • 7518

freetype渲染字体范例

freetype初始化如下:     if (mFTFace == 0 )     {         if (FT_Init_FreeType( &mFTLibrary ))        ...
  • hgl868
  • hgl868
  • 2012年04月10日 11:07
  • 4896

FreeType2使用总结

一、FreeType2简介 1. 是一个免费、开源、可移植且高质量的字体引擎; 2. 支持多种字体格式文件,并提供了统一的访问接口; 3. 支持单色位图、反走样位图渲染,这使字体显示质量达到Ma...
  • finewind
  • finewind
  • 2014年07月26日 10:58
  • 14228

使用FreeType实现矢量字体的粗体、斜体、描边、阴影效果(转载)

前言: Freetype是一个跨平台、开源的字体渲染器,网上很多文章介绍,本人就不啰嗦了。本文重点在于实现文章标题所属的各种效果,不是Freetype的基本使用方法介绍文档,所以对于Freety...
  • Angle502
  • Angle502
  • 2014年12月03日 21:18
  • 1697

文本处理以及freetype的使用

1. 字符编码 编码 解释 GBK(国标扩展码) 英文字符用一个字节进行表示,值小于等于 127。汉字用两个字节进行表示,对应的区位码由国家标准指定 UTF-8 变长编码,中文文...
  • u013904227
  • u013904227
  • 2016年08月03日 16:13
  • 1775

使嵌入式Qt支持中文字体变换的方法(makeqpf)

QT4.7.0在移植到开发板上的时候,中文支持是必不可少的,如何让QT支持中文,如何制作QT支持的字体文件,如何使QT UI编辑器中的字号与开发板中的字号一致。作者通过实验进行了一一验证。 介绍: ...
  • zgrjkflmkyc
  • zgrjkflmkyc
  • 2013年06月10日 13:15
  • 10127

嵌入式Qt-4.8.6显示中文并且改变字体大小和应用自己制作的字体库

问题: QT4.8.6在移植到开发板上的时候,中文支持是必不可少的,如何让QT支持中文,如何制作QT支持的字体文件,如何使QT UI编辑器中的字号与开发板中的字号一致。 详解: 1>如何让Q...
  • u014213012
  • u014213012
  • 2016年11月26日 16:32
  • 1584
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 初探freetype字体库
举报原因:
原因补充:

(最多只允许输入30个字)