使用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

你可能感兴趣的:(使用FreeImage写Freetype2字体图片)