使用FreeImage写Freetype2字体图片

以前用OGL时,一直使用FreeImage加载纹理图片。后来使用OGRE/CEGUI,也是用FI加载纹理图片。但这些都是它们底层管理的,用的时候也就没什么特别的感觉了。由于OGRE/CEGUI都使用FreeType2渲染字体,于是乎,就像自己来渲染一下看看。

代码很简单,没什么好说的。不过自己感觉这个结构流程还是蛮清晰的,贴出来留个纪念(明天开始做CEGUI字体优化~~)

view plaincopy to clipboardprint?
01./**
02. * @file e:\Exercise\FTWorkshop\Exer01\main.cpp
03. * @author Vendar Tyan
04. * @date 2010/04/18
05. * @version 0.1
06. * @brief 使用FreeImage写FreeType2字体图片
07. */
08.#include <iostream>
09.#include <string>
10.#include <FreeImage.h>
11.#include <ft2build.h>
12.#include FT_FREETYPE_H
13.#include FT_GLYPH_H
14.////////////////////////////////////////////////////////////////////////////////
15.//----------------------------------------------------------------------------//
16.// 初始化函数
17.bool Init(const std::string &fontFileName);
18.// 写到图片
19.bool DrawToImage(wchar_t uchar,int fw,int fh,const std::string &imgFileName);
20.// 清理资源
21.void DeInit(void);
22.// 全局句柄
23.FT_Library g_ftLib;
24.FT_Face g_ftFace;
25.////////////////////////////////////////////////////////////////////////////////
26.//----------------------------------------------------------------------------//
27.int main(int argc,char **argv)
28.{
29. using namespace std;
30. if ( argc < 2 || !Init(argv[1]) )
31. {
32. cout<<"初始化失败!"<<endl;
33. return -1;
34. }
35. DrawToImage(L'家',48,48,"jia.jpg");
36.
37. DeInit();
38. return 0;
39.}
40.////////////////////////////////////////////////////////////////////////////////
41.//----------------------------------------------------------------------------//
42.bool Init(const std::string &fontFileName)
43.{
44. // 初始化字体库
45. if ( FT_Init_FreeType(&g_ftLib) ) { return false; }
46. if ( FT_New_Face(g_ftLib,fontFileName.c_str(),0,&g_ftFace) ) { return false; }
47. // FreeImage
48. FreeImage_Initialise();
49. return true;
50.}
51.//----------------------------------------------------------------------------//
52.bool DrawToImage(wchar_t uchar,int fw,int fh,const std::string &fileName)
53.{
54. // 设置字体大小
55. FT_Set_Char_Size(g_ftFace,fw<<6,fh<<6,96,96);
56. // 加载并渲染字体GLYPH
57. FT_Load_Glyph(g_ftFace,FT_Get_Char_Index(g_ftFace,uchar),FT_LOAD_DEFAULT);
58. FT_Glyph glyph;
59. FT_Get_Glyph(g_ftFace->glyph,&glyph);
60. FT_Render_Glyph(g_ftFace->glyph,FT_RENDER_MODE_NORMAL);
61. // 拷贝到图片写入文件
62. FT_Bitmap *pBmp = &g_ftFace->glyph->bitmap;
63. int w = pBmp->width;
64. int h = pBmp->rows;
65. FIBITMAP *fib = FreeImage_Allocate(w,h,24);
66. RGBQUAD rgb;
67. for ( int i=0;i<h;++i )
68. {
69. for ( int j=0;j<w;++j )
70. {
71. rgb.rgbRed = pBmp->buffer[i*w+j];
72. rgb.rgbGreen = pBmp->buffer[i*w+j];
73. rgb.rgbBlue = pBmp->buffer[i*w+j];
74. FreeImage_SetPixelColor(fib,j,h-i,&rgb);
75. }
76. }
77. FreeImage_Save(FIF_JPEG,fib,fileName.c_str());
78. FreeImage_Unload(fib);
79. return true;
80.}
81.//----------------------------------------------------------------------------//
82.void DeInit()
83.{
84. FT_Done_Face(g_ftFace);
85. FT_Done_FreeType(g_ftLib);
86. FreeImage_DeInitialise();
87.}
/**
* @file e:\Exercise\FTWorkshop\Exer01\main.cpp
* @author Vendar Tyan
* @date 2010/04/18
* @version 0.1
* @brief 使用FreeImage写FreeType2字体图片
*/
#include <iostream>
#include <string>
#include <FreeImage.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------//
// 初始化函数
bool Init(const std::string &fontFileName);
// 写到图片
bool DrawToImage(wchar_t uchar,int fw,int fh,const std::string &imgFileName);
// 清理资源
void DeInit(void);
// 全局句柄
FT_Library g_ftLib;
FT_Face g_ftFace;
////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------//
int main(int argc,char **argv)
{
using namespace std;
if ( argc < 2 || !Init(argv[1]) )
{
cout<<"初始化失败!"<<endl;
return -1;
}
DrawToImage(L'家',48,48,"jia.jpg");

DeInit();
return 0;
}
////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------//
bool Init(const std::string &fontFileName)
{
// 初始化字体库
if ( FT_Init_FreeType(&g_ftLib) ) { return false; }
if ( FT_New_Face(g_ftLib,fontFileName.c_str(),0,&g_ftFace) ) { return false; }
// FreeImage
FreeImage_Initialise();
return true;
}
//----------------------------------------------------------------------------//
bool DrawToImage(wchar_t uchar,int fw,int fh,const std::string &fileName)
{
// 设置字体大小
FT_Set_Char_Size(g_ftFace,fw<<6,fh<<6,96,96);
// 加载并渲染字体GLYPH
FT_Load_Glyph(g_ftFace,FT_Get_Char_Index(g_ftFace,uchar),FT_LOAD_DEFAULT);
FT_Glyph glyph;
FT_Get_Glyph(g_ftFace->glyph,&glyph);
FT_Render_Glyph(g_ftFace->glyph,FT_RENDER_MODE_NORMAL);
// 拷贝到图片写入文件
FT_Bitmap *pBmp = &g_ftFace->glyph->bitmap;
int w = pBmp->width;
int h = pBmp->rows;
FIBITMAP *fib = FreeImage_Allocate(w,h,24);
RGBQUAD rgb;
for ( int i=0;i<h;++i )
{
for ( int j=0;j<w;++j )
{
rgb.rgbRed = pBmp->buffer[i*w+j];
rgb.rgbGreen = pBmp->buffer[i*w+j];
rgb.rgbBlue = pBmp->buffer[i*w+j];
FreeImage_SetPixelColor(fib,j,h-i,&rgb);
}
}
FreeImage_Save(FIF_JPEG,fib,fileName.c_str());
FreeImage_Unload(fib);
return true;
}
//----------------------------------------------------------------------------//
void DeInit()
{
FT_Done_Face(g_ftFace);
FT_Done_FreeType(g_ftLib);
FreeImage_DeInitialise();
}

然后,到CMD里执行:Exer01 "simsun.ttc"

就可以看到结果了,(为了不影响思路的清晰,于是就没做字符串的输出,其实这个拓展也是很简单的~~)


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/eplaylity/archive/2010/04/18/5499863.aspx

你可能感兴趣的:(C++,c,.net,C#,J#)