[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*16点, 有32*32点 等等.

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

 

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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值