在上一节里面,我们显示的是点阵字体。这种字体比较简单,但是它有一个缺点就是,一旦选定了字库,每个字符的大小就确定了,无法更改。在本节里面我们将引入矢量字体的概念,矢量字体将弥补点阵字体无法更改字体大小的缺点。
1、原理简述
一个字可以用多条曲线来表示,而对于每条曲线我们保存其关键点,这样就可以用来表示这个字了。
我们想要显示的时候,就取出这些关键点,并采用平滑的曲线将这些关键点连接起来,最后填充闭合空间。
想要放大或缩小的时候,只需要按比例缩放改变关键点的相对位置就可以了!
2、显示过程
(1)在字体文件中保存着对应着不同编码类型的文字,当然其保存的方法就是保存关键点以及相对位置
(2)根据文字的编码值从字体文件中找到对应的文字,即glyph,当然找到的是其关键点和相对位置
(3)设置字体大小
(4)用某些函数把glyph里的点缩放为设置的字体大小
(5)转换为位图点阵
(6)在LCD上显示出来
3、freetype2
上面我们说了矢量字体的显示过程,那么具体应该怎么操作呢?这就需要freetype2了,下面我们来详细说一下:
(1)初始化库:FT_Init_FreeType
(2)加载字体face:
FT_New_Face:从文件中加载字体
FT_New_Memory_Face:从内存中加载字体
(3)设置大小
FT_Set_Char_Size
FT_Set_Pixel_Sizes
(4)根据字符的编码值加载glyph
a:FT_Select_CharMap( face, FT_ENCODING_BIG5 );
选择编码方式
b:FT_Get_Char_Index( face, charcode )
把字符编码转换为索引值,根据该索引就可以找到glyph
c:FT_Load_Glyph( face,glyph_index, load_flags );
从face中取出glyph
d:FT_Render_Glyph( face->glyph, render_mode );
将glyph转换为位图
(5)变换:移动、旋转
FT_Set_Transform
测试FreeType提供的demo程序(1)
简介:
2.3 使用freetype来显示任意大小的文字
2.3.1节_数码相框_freetype理论介绍
2.3.2节_数码相框_在PC上测试freetype
在PC:安装freetype-2.4.10.tar.bz2
tar xjf freetype-2.4.10.tar.bz2
./configure
make
sudo make install
编译
gcc -o example1 example1.c -I /usr/local/include/freetype2 -lfreetype -lm
指定字符
gcc -finput-charset=GBK -fexec-charset=UTF-8 -o example1 example1.c -I /usr/local/include/freetype2 -lfreetype -lm
测试
./example1 ./simsun.ttc abc
一 代码如下
/* example1.c
* This small program shows how to print a rotated string with the
* FreeType 2 library.
*/
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#define WIDTH 80
#define HEIGHT 80
/* origin is the upper left corner */
unsigned char image[HEIGHT][WIDTH];
/* Replace this function with something useful. */
void draw_bitmap( FT_Bitmap* bitmap, FT_Int x, FT_Int y)
{
FT_Int i, j, p, q;
FT_Int x_max = x + bitmap->width;
FT_Int y_max = y + bitmap->rows;
for ( i = x, p = 0; i < x_max; i++, p++ )
{
for ( j = y, q = 0; j < y_max; j++, q++ )
{
if ( i < 0 || j < 0 ||
i >= WIDTH || j >= HEIGHT )
continue;
image[j][i] |= bitmap->buffer[q * bitmap->width + p];
}
}
}
void
show_image( void )
{
int i, j;
for ( i = 0; i < HEIGHT; i++ )
{
for ( j = 0; j < WIDTH; j++ )
putchar( image[i][j] == 0 ? ' '
: image[i][j] < 128 ? '+'
: '*' );
putchar( '\n' );
}
}
int main( int argc , char** argv )
{
FT_Library library;
FT_Face face;
FT_GlyphSlot slot;
FT_Matrix matrix; /* transformation matrix */
FT_Vector pen; /* untransformed origin */
FT_Error error;
char* filename;
char* text;
double angle;
int target_height;
int n, num_chars;
if ( argc != 3 )
{
fprintf ( stderr, "usage: %s font sample-text\n", argv[0] );
exit( 1 );
}
filename = argv[1]; /* first argument */
text = argv[2]; /* second argument */
num_chars = strlen( text );
angle = ( 0.0 / 360 ) * 3.14159 * 2; /* 角度 */
target_height = HEIGHT;
FT_Init_FreeType( &library ); /* initialize library,详见注释1 */
FT_New_Face( library, argv[1], 0, &face ); /* create face object ,详见注释2*/
FT_Set_Pixel_Sizes(face, 24, 0); //见注释3
slot = face->glyph;
/* set up matrix */
matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L );
matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L );
matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L );
/* the pen position in 26.6 cartesian space coordinates; */
/* start at (0,40) relative to the upper left corner */
pen.x = 0 * 64;
pen.y = ( target_height - 40 ) * 64;
for ( n = 0; n < num_chars; n++ )
{
/* set transformation ,见注释4*/
FT_Set_Transform( face, &matrix, &pen );
/* load glyph image into the slot (erase previous one) */
error = FT_Load_Char( face, text[n], FT_LOAD_RENDER ); //见注释5
if ( error )
continue; /* ignore errors */
/* now, draw to our target surface (convert position) */
draw_bitmap( &slot->bitmap,
slot->bitmap_left,
target_height - slot->bitmap_top ); //见注释6
/* increment pen position */
pen.x += slot->advance.x;
pen.y += slot->advance.y;
}
show_image(); //显示字体
FT_Done_Face ( face );
FT_Done_FreeType( library );
return 0;
}
注释1:FT_Init_FreeType( &library );
功能:这是初始化一个库,所谓库我们可以简单的理解为一个空间,用来存放所有的资源。
注释2:FT_New_Face( library, argv[1], 0, &face );
功能:读取字体文件中指定类型的字体,并用face来描述它
参数1:表示库
参数2:要打开的文件
参数3:表示要加载的字体的类型,0表示任何类型都可以
参数4:face
一个文件里面可能会含有多种字体,每个字体对应着一个face,也就是说face用来描述某一种字体。
注释3:FT_Set_Pixel_Sizes(face, 24, 0);
功能:设置字符的像素大小
参数1:face
参数2:每行多少像素,0表示与列相同
参数3:每列多少像素,0表示与行相同
注释4:FT_Set_Transform( face, &matrix, &pen );
功能:设置传输
参数1:face
参数2:用于设置字体的旋转角度
参数3:用于设置字体的平显示位置
注释5:FT_Load_Char( face, text[n], FT_LOAD_RENDER );
功能:将一个字型的点阵信息记录在face->glyph中
参数1:face
参数2:要记录的字型的编码
参数3:参数
注释6:draw_bitmap( &slot->bitmap , slot->bitmap_left , target_height - slot->bitmap_top );
功能:将字符的点阵存放在一个结构体里面
参数1:用于描述点阵信息的结构体
参数2:x坐标
参数3:y坐标
注意:我们这里的坐标是笛卡尔坐标系,也就是y坐标向上,x坐标向右!而在LCD上的显示坐标系y轴是反向的,所以显示的时候需要将y轴处理一下!
我们来总结一下显示一个矢量字符我们都做了什么:
1、初始化一个库
2、加载字体,并用创建一个face来描述字体
3、设置字体的像素大小
4、设置字体的旋转角度以及显示位置
5、找到字型的点阵信息并记录下来
6、显示点阵
二、测试
1、解压
2、进入到解压文件的根目录
3、配置:./configure
4、编译:make
5、安装:make install
库文件安装到了:/usr/local/lib
头文件安装到了:/usr/local/include/freetype2/freetype/
6、编译应用程序:
gcc -o example1 example1.c -I /usr/local/include/freetype2 -lfreetype -lm
-I:用于指定头文件的目录
-l紧跟库的名字:用于指定库
-lm:指明要用数学函数库
7、将编译好的文件与字体文件放在同一个文件夹里面
8、测试: ./example1 ./simsun.ttc agfaaa
![](/assets/blank.gif)
数码相框——矢量字体原理(1)相关推荐
- 数码相框(四、使用freetype库实现矢量字体显示)
注:本人已购买韦东山第三期项目视频,内容来源<数码相框项目视频>.数码相框-通过freetype库实现矢量显示,只用于学习记录,如有侵权,请联系删除. 在数码相框(三.LCD显示文 ...
- Linux电子书项目之freetype实现矢量字体的显示(2)
上一篇博文我们通过点阵数组实现了字母的显示:http://blog.csdn.net/shenhuan1104/article/details/79476053 现在我们通过freetype这个框架在 ...
- 利用Python理解TTF矢量字体显示原理
本文从微软雅黑字体MSYH.TTF中抽取出2次B样条曲线和直线的控制节点坐标数据,利用Python将汉字轮廓绘制出来. MSYH字体轮廓是由2次B样条曲线和直线构成的,下图(fontforge软件获取 ...
- WindML、FreeType和TrueType三者相结合实现矢量字体的显示
1 VxWorks5.5点阵字库的局限性 VxWorks5.5 是美国风河公司开发的嵌入式操作系统,图形系统采用WindML3.0,支持点阵字显示,不支持矢量字体显示.点阵字采用内存模式加载,使用前需 ...
- UWP 矢量字体图标(iconfont)使用
本文使用 阿里巴巴开源字体: 选择矢量字体图标: 查看或编辑 Unicode编码 或字体名称 下载到本地,添加到uwp项目 代码中写法 Text:Unicode编码 FontFamily:文件路径#字 ...
- linux美化原理,x-window字体原理及美化
x-window字体原理及美化 发布时间:2006-10-07 01:25:15来源:红联作者:caldo 1. 简介 在我必须处理的一堆讨厌事中,有一项就是没完没了的 X 缺省字体和字体设定 (我专 ...
- WPF自定义控件与样式(1)-矢量字体图标(iconfont)
原文:WPF自定义控件与样式(1)-矢量字体图标(iconfont) 一.图标字体 图标字体在网页开发上运用非常广泛,具体可以网络搜索了解,网页上的运用有很多例子,如Bootstrap.但在C/S程序 ...
- 元件库导入_最新版字体图标元件库分享,一套绝佳的矢量字体图标元件库
这次分享的FontAwesome v5字体图标元件库,是根据官方的最新版本v5.7.2整理完成的,包含了更全面的图标类型和丰富的图标数量,相信可以满足大多数同学在原型设计中的使用需求. FontAwe ...
- 神经网络开始设计字体,可根据“矢量字体”变换大小写
EricBernhardsson将50000种字体放入神经网络进行研究,神经网络能够识别字体矢量,并能在大小写之间进行转换. 神经网络目前已经发挥着越来越重要的作用,很多研究者希望可以对神经网络做进一 ...
最新文章
- matlab自动给变量命名
- MyBatis(延迟加载 缓存)
- [剑指offer]面试题第[58-2]题[JAVA][左旋转字符串][拼接]
- Windows内存保护机制及绕过方法
- RabbitMQ——work queue
- 广东机电职业技术学校计算机怎么样,广东机电职业技术学院宿舍怎么样 住宿条件好不好...
- [译] 在远程工作中领悟到的 10 件事
- 反击ARP欺骗 我和网络执法官的战斗
- Ruby+watir自动化测试中实现识别验证码图片
- 破解intelliJ idea 2017
- AVC、HEVC、VVC帧间预测技术
- SpringBoot整合通用Mapper和PageHelper,使用PageHelper.startPage()失效的问题
- 【idea drools 执行20次失败中断崩溃】
- excel输入 正在计算机,在Excel中输入内容后如何自动填写日期和时间
- Windows 错误代码
- PostgreSQL安装 弹出Error running
- iOS端使用DSA加密
- redhat 7 手册
- pb 制作程序运行报错界面
- c# Byte解压,压缩
热门文章
- 2019亚马逊无货源店群跨境电商,让你轻松做外贸!
- 上周热点回顾(9.16-9.22)
- 分布式系统关注点:高内聚低耦合
- 重走长征路---OI每周刷题记录---11月16日 2013
- 嵌入式Linux引导过程之1.3——Xloader的sys_init
- 深入浅出ConcurrentHashMap详解
- 用品牌名吸引流量的“四三二一”法则
- 王者服务器维护11月,王者荣耀11月14日更新公告 王者荣耀11月14日更新内容一览-游侠手游...
- 几种冒泡(起泡)排序的总结
- Fiddler Everywhere抓包配置