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

这篇博客详细介绍了如何在Linux环境中使用FreeType2库,将GB2312编码的汉字转换为图片。代码首先将GB2312编码转换为Unicode,然后利用FreeType2的API获取汉字的字体位图,并生成256级灰度的像素数组。文章还提供了字符位图与背景图片融合的公式。代码来源于作者的LCUI图形库,需要进一步修改才能使用。
摘要由CSDN通过智能技术生成


能显示汉字的比较难找,C语言代码写的更难找,能找到的,基本上是被转载了N遍的同一个示例代码,基本上解决不了我的问题。
 
于是乎,花费了不少时间才完成了这些代码;
 
主要功能是:
 
将传入的GB2312编码的char型字符串转换成图片数组并输出。
 


主要原理是:
 
将GB2312编码的char型字符串,转换成unicode编码的wchar_t型字符串;
 
之后,利用FreeType2的API获取汉字的字体位图。
 


代码看似不怎么复杂,之前找char转wchar_t的代码,没找到一个合适的,最后呢,东拼西凑,就得到了想要的代码;
 
还有,输出的是记录每个像素点的256级灰度的数组,也就是和png图片中alpha通道一样,0 - 255表示透明度,0为完全透明,255为不透明;

 
想要将这些文字贴到图片上,有个公式:
 
r2 = (r1 * alpha + r2 * (255 - alpha)) /255;
g2 = (g1 * alpha + g2 * (255 - alpha)) /255;
b2 = (b1 * alpha + b2 * (255 - alpha)) /255;

 
r、g、b表示图片的red、green、blue三种颜色,这三种颜色通过组合可以变成不同的颜色;
 
alpha是文字位图的alpha通道;
 
r2、b2、g2是图片重叠后该像素点显示的颜色;
r1、b1、g1是文字位图的每个像素点显示的颜色。
 
相关信息请参考这篇文章:http://www.linuxidc.com/Linux/2012-01/52144.htm
 

 


有需要这些代码的人的话,请把代码改一下,因为这是从我的LCUI图形库的代码中复制过来的,不能直接使用。
 

 


[cpp]
1.#include "LCUI_Build.h"  
 2.#includeLCUI_MAIN_H  
 3.#includeLCUI_FONTS_H   
 4.#include"all.h"  
 5. 
 6. 
 7.int code_convert(char *from_charset,char*to_charset,const char *inbuf,unsigned intinlen, 
 8.unsigned char *outbuf,unsigned intoutlen) 
 9.{ 
 10.   iconv_t cd; 
 11.   const char **pin = &inbuf; 
 12.   unsigned char **pout = &outbuf; 
 13.   cd = iconv_open(to_charset,from_charset); 
 14.   if (cd==0) return -1; 
 15.   memset(outbuf,0,outlen); 
 16.   if (iconv(cd,(char**)pin,&inlen,(char**)pout,&outlen)==-1)return -1; 
 17.   iconv_close(cd); 
 18.   return 0; 
 19.} 
 20. 
 21. 
 22.int GB2312_To_UTF8(const char *inbuf,unsignedint inlen,unsigned char *outbuf,unsigned intoutlen) 
 23.{ 
 24.   returncode_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen); 
 25.} 
 26. 
 27.unsigned short Get_Unicode(char*in_gb2312) 
 28.{ 
 29.   unsigned char out[256]; 
 30.   int rc; 
 31.   unsigned int length_gb2312; 
 32. 
 33.    
 34.   length_gb2312 = strlen(in_gb2312); 
 35.   rc =GB2312_To_UTF8(in_gb2312,length_gb2312,out,256); 
 36. 
 37.    
 38.   unsigned short unicode; 
 39.   unicode = out[0]; 
 40.   if (unicode >= 0xF0) { 
 41.       unicode = (unsigned short) (out[0] & 0x07) <<18; 
 42.       unicode |= (unsigned short) (out[1] & 0x3F) <<12; 
 43.       unicode |= (unsigned short) (out[2] & 0x3F) <<6; 
 44.       unicode |= (unsigned short) (out[3] &0x3F); 
 45.   } else if (unicode >= 0xE0) { 
 46.       unicode = (unsigned short) (out[0] & 0x0F) <<12; 
 47.       unicode |= (unsigned short) (out[1] & 0x3F) <<6; 
 48.       unicode |= (unsigned short) (out[2] &0x3F); 
 49.   } else if (unicode >= 0xC0) { 
 50.       unicode = (unsigned short) (out[0] & 0x1F) <<6; 
 51.       unicode |= (unsigned short) (out[1] &0x3F); 
 52.   
 53.   return unicode; 
 54.} 
 55. 
 56. 
 57. 
 58. 
 59.int Show_Font_Bitmap(Font_Bitmap_Data*in_fonts) 
 60. 
 61.{ 
 62.   int x,y; 
 63.   for(y=0;yheight;++y){ 
 64.       for(x=0;xwidth;++x){ 
 65.           if(in_fonts->text_alpha[y*in_fonts->width+x]>0) 
 66.        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值