能显示汉字的比较难找,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.}