04.freetype显示中文

1.用unicode码显示中文

int chin[] = {0x97e6,0x4e1c,0x5c71,0x0067}; //韦东山g

定义要显示的中文,然后显示,这样的方法是可以的。
在这里插入图片描述
中文在unicode编码中是两个字符,英文是一个字符,所以用以上方法是正确的,因为显示时是一个字符一个字符输入进去转换再显示的,而如果这样写:

char chin[]="韦东山g";

就会出现乱码,原因如下:

0x97e6  0x4e1c 0x5c71 0x0067
韦东山g的unicode码,共占用了7个字节,所以chin数组有7个元素
而下面是一个一个元素输入进去转换再显示,所以0x97和0xe6就会被分开,认为是两个字符,所以出现了乱码。
即使我们在程序上做处理,但是我们并不能分清哪些是中文(两个字符),哪些是英文(一个字符)。

2.宽字符:wchar_t

如果用char存储汉字英文等,则还需要判断数据类型,而wchar_t刚好可以放一个unicode字符

注意:wchar_t在windows占2byte,在linux占4bytes.

宽字符:wchar_t

头文件: #include<wchar.h>

通过wcslen()判断wchar_t数组大小

#include<wchar.h>
wchar_t *chinese_str = L"韦东山g"; //定义一个宽字符地址指向这个字符串
wcslen(chinese_str);              //计算chines_str指向几个字符

实验:
在这里插入图片描述
直接编译出现 转换字符集 的错误
在这里插入图片描述
我们在编写的时候用的是ANSI码,就是GBK
而输出的使需要UTF-8
需要在编译的时候指定输入文件字符集和输出文件字符集:

gcc  -finput-charset=GBK  -fexec-charset=UTF-8  -o  ansi ansi.c 

执行结果:
在这里插入图片描述
和之前手工输入的编码是一样的。

3.字符显示超出基准线

在这里插入图片描述
添加打印一下行号后得出的结果如下
在这里插入图片描述
我们代码中定义的坐标是(0,40),而实际上很多字都会超出一点。
freetype库中有这么一张图片:
在这里插入图片描述
字母的一部分会超出基线一点。
在汉字中,都在原点上面是没有问题的,但是一些英文字母比如g等,都会在基线下面,所以为了兼容所有语言文字,就会把字拉倒基线下面一点,如上图所示。
上图中,xMin表示该字符在x坐标最小处,同理xMax,yMax,yMin。
adevance是本字符的大小,下个字符的位置就是本字符的原点加上advance,程序如下:

 pen.x += slot->advance.x; //pen是下个字符的原点信息
 pen.y += slot->advance.y;

这个advance.x 和 advance.y应该是在之前设置角度那个函数 (FT_Set_Transform( face, &matrix, &pen ); ) 中设置的,这样即使是想旋转显示(如下图),也一样使用这两行代码就行。
在这里插入图片描述

4.获取位图文字的信息

  1. 添加头文件
#include FT_GLYPH_H
  1. 通过F_Get_Glyph()将一个字形图像(face->glyph)存到FT_Glyph类型的变量中
  2. 再通过FT_Glyph_Get_CBox()获得bbox,bbox里面有信息,代码如下
FT_BBox bbox;     //这里面存着 xMin yMin xMax yMax
FT_Glyph glyph;

 //设置字用不用旋转和开始显示的位置
FT_Set_Transform( face, &matrix, &pen ); 
 //转换为点阵
error = FT_Load_Char( face, wst[n], FT_LOAD_RENDER );

//通过字符编码,获取字形图像存到face->glyph里,并转为位图存到face->glyph->bitmap->buffer[]里    
//error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NORMAL )


error = FT_Get_Glyph( face->glyph, &glyph );     //将字形图像(face->glyph)存到glyph里
//获得FT_BBox ,即获得xMin...等四个元素。 无返回值
FT_Glyph_Get_CBox(glyph,FT_GLYPH_BBOX_TRUNCATE,&bbox); 

//做一下显示
printf("Unicode:0x%x\n",wst[n]);
printf("lcd_x:%d , lcd_y=%d \n ",slot->bitmap_left,target_height - slot->bitmap_top);
printf("xMin = %d, xMax = %d\n",bbox.xMin,bbox.xMax);

//根据位图信息画点
draw_bitmap( &slot->bitmap,          //位图存在的地方 &slot->bitmap = &face->glyph->bitmap->buffer
              slot->bitmap_left,      //x坐标
              target_height - slot->bitmap_top ); //y坐标
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值