[TTF字体]获取TTF字体的点阵信息

获取TTF字体的点阵信息还是使用GetGlyphOutline

看代码

	CClientDC dc(this);
	HDC hDC = dc.GetSafeHdc();
	//创建字体
	CFont font;
	VERIFY(font.CreateFont(32, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET,
		OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "宋体"));
	CFont *pOldFont = dc.SelectObject(&font);
	// 定义并初始化变换矩阵
	MAT2 mat2;										
	memset(&mat2, 0, sizeof(mat2));
	mat2.eM11.value = 1;
	mat2.eM22.value = -1;			// 我这里写-1, 字体会倒置, 结合BMP的格式

	GLYPHMETRICS metrics;		// 保存字符相关信息
	DWORD dwDataSize = 0;		// 初始化字符数据缓冲区大小
		
	//……

	// 通过函数GetGlyphOutline()确定存储字符结构的空间
	wchar_t nChar = L'我';
	::TextOut(dc.m_hDC, 0, 0, "我", 2);

	dwDataSize = ::GetGlyphOutlineW(dc.m_hDC, (UINT)nChar, GGO_BITMAP, &metrics, 0, NULL, &mat2);
	if ((dwDataSize != 0) && (dwDataSize != GDI_ERROR))
	{
		CMYBitmap myBitmap;
		myBitmap.Create(1, metrics.gmBlackBoxX, metrics.gmBlackBoxY, true);
		dwDataSize = ::GetGlyphOutlineW(dc.m_hDC, (UINT)nChar,GGO_BITMAP,&metrics, myBitmap.m_lBITMAPDATALen, myBitmap.m_pBITMAPDATA, &mat2);

		char chTemp[MAX_PATH];
		sprintf(chTemp, "E:\\我.bmp");
		CMYBitmapReader::SaveBitmap(chTemp, myBitmap);
	}

点阵数据就是BMP格式的数据构建好BMP相关的信息头后即可显示在DC或者保存在BMP文件中

GGO_BITMAP 1位位图

其他的你可以使用8位位图保存但注意颜色表的构建.


那些LED显示条一个字有16*1632*32点 等等.

记得以前做过一个程序输入文字把该文字的转成对应点阵格式. 对于16*16或者32*32的点阵屏使用TTF字体的数据提取并不是最好的因为提取出来的文字特别是中文点阵的范围不是很固定(例如你设置字体高度是32, 但提取出来的点阵信息并不一定是32*32有些29, 有些31等等).

16*16或者32*32点阵屏可以找DOS系统中的点阵文件来提取如果大于32*32就可以考虑使用TTF来提取但是要做一些处理来对齐文字的显示.



你可能感兴趣的:(VC,C/C++)