使用freetype库将文字嵌入到bmp图片中 学习笔记

首先需要打开一张bmp图片,将图片读入内存中。然后连接freetype类库,使用的是freetype2.4.9版本,VS2010。

为了简单处理,使用的bmp图片为24位位图,960*540大小的一张位图,直接用画图工具另存为就好,这样宽度默认就是4的倍数。

以下代码简单的实现了把字体嵌入到24位bmp图片的指定坐标位置上。

#include 
#include 
#include 
#include 
#include 
#include 
#include FT_FREETYPE_H
#include 
#include 

using namespace std;

/*
//windows.h中已经定义了以下的这些东西,直接用就可以了
typedef unsigned char BYTE;  
typedef unsigned short WORD;  
typedef unsigned int DWORD;  
typedef long LONG;  

//位图文件头定义;   
//其中不包含文件类型信息(由于结构体的内存结构决定,   
//要是加了的话将不能正确读取文件信息)   
typedef struct  tagBITMAPFILEHEADER{  
//WORD bfType;//文件类型,必须是0x424D,即字符“BM”   
DWORD bfSize;//文件大小   
WORD bfReserved1;//保留字   
WORD bfReserved2;//保留字   
DWORD bfOffBits;//从文件头到实际位图数据的偏移字节数   
}BITMAPFILEHEADER;  

typedef struct tagBITMAPINFOHEADER{  
DWORD biSize;//信息头大小   
LONG biWidth;//图像宽度   
LONG biHeight;//图像高度   
WORD biPlanes;//位平面数,必须为1   
WORD biBitCount;//每像素位数   
DWORD  biCompression; //压缩类型   
DWORD  biSizeImage; //压缩图像大小字节数   
LONG  biXPelsPerMeter; //水平分辨率   
LONG  biYPelsPerMeter; //垂直分辨率   
DWORD  biClrUsed; //位图实际用到的色彩数   
DWORD  biClrImportant; //本位图中重要的色彩数   
}BITMAPINFOHEADER; //位图信息头定义   

typedef struct tagRGBQUAD{  
BYTE rgbBlue; //该颜色的蓝色分量   
BYTE rgbGreen; //该颜色的绿色分量   
BYTE rgbRed; //该颜色的红色分量   
BYTE rgbReserved; //保留值   
}RGBQUAD;//调色板定义   
*/
//像素信息   
typedef struct tagIMAGEDATA  
{  
	BYTE blue;  
	BYTE green;  
	BYTE red;  
}IMAGEDATA;     

//变量定义   
BITMAPFILEHEADER strHead;    
BITMAPINFOHEADER strInfo;
IMAGEDATA *arrayColor;
LONG nWidth;
LONG nHeight;

//显示位图文件头信息   
void showBmpHead(BITMAPFILEHEADER pBmpHead){  
	cout<<"位图文件头:"< glyph,  & glyph);
			//  convert glyph to bitmap with 256 gray
			FT_Glyph_To_Bitmap( & glyph, ft_render_mode_normal,  0 ,  1 );
			FT_BitmapGlyph    bitmap_glyph  =  (FT_BitmapGlyph)glyph;
			//得到字体的bitmap位图
			FT_Bitmap &     bitmap  =  bitmap_glyph -> bitmap;
			//把字插入到图片中,每个字中间间隔10个像素,并且离左上角x=100,y=100偏移量
			for ( int  i = 0 ; i < bitmap.rows;  ++ i)
			{
				for ( int  j = 0 ; j < bitmap.width;  ++ j)
				{
					
					if(bitmap.buffer[i * bitmap.width + j]!=0)
					{
					  //像素点存在,就置为红色,其他都为默认的白色
						arrayColor[(i+100)*strInfo.biWidth+j+bitmap_width_sum+100].green=0;
						arrayColor[(i+100)*strInfo.biWidth+j+bitmap_width_sum+100].blue=0;
					}
				}
			}
			bitmap_width_sum+=bitmap.width+15;
		}
		//  free glyph
		FT_Done_Glyph(glyph);
		glyph  =  NULL;
		//  free face
		FT_Done_Face(pFTFace);
		pFTFace  =  NULL;

		//  free FreeType Lib
		FT_Done_FreeType(pFTLib);
		pFTLib  =  NULL;
		fclose(fpi);  
	}  
	else{  
		cout<<"file open error!"<>strFile;  
	WordInsertToBmp(strFile);  
	system("pause");  
}



图片预览:bmp原始图片用的是纯白的底。




你可能感兴趣的:(使用freetype库将文字嵌入到bmp图片中 学习笔记)