字样索引(Glyph Index)与字符之间的转换
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
本文是我研究针对复杂文本屏幕取词和动态翻译关键技术而写的日记(C语言)
马依尔江
首先我们必须要知道索引值(Glyph Index Value)和字符(Char)的关系。通常一个TTF字体中有很多字符,每个字符对应一个形状,有些字符的字符UNICODE码不一样,可是形状是一样的,也就是说不同的字符的形状有可能是同一个样的。所为字样索引就是字体中的那些形状的排序号。从0开始到N结束。如果一个字体里面有M个字符,那么该字体里包含M个字符的形状。有可能包含形状同一个的字符,所以,总形状数不一定等于M,有很大可能小于M。正是这个形状数,就是总得索引数。比如:
0-a
1-b
2-c
…
…
15-G
…
…
如果两个不同的字符的形状是同一个形状。那么这个两个字符的该字体中字样索引值是一样的。
通过字符得到索引值,或者通过索引值得到字符–可以调用两个Windows API 来完成。
1)GetFontUnicodeRanges
2)GetGlyphIndices
第一个GetFontUnicodeRanges的作用就是得到指定场景使用的字体包含的所有字符。
第二个GetGlyphIndices的作用就是通过字符得到字符的索引。
MSDN对GetFontUnicodeRanges的参数给了错误的描述,应为制造MSDN的不是外星人,而是正常地球人。所以人人会错的。
WINGDIAPI DWORD WINAPI GetFontUnicodeRanges(HDC hdc, LPGLYPHSET lpgs);
hdc–场景句柄。
lpgs–函数返回的结构体。该结构体包含字符信息。
如果调用GetFontUnicodeRanges的时候设置第二个参数为NULL那么函数返回lpgs结构体所需要的内存空间,而不是MSDN上描述的glyphset结构体指针。
简单实例,我们现在获取已知的场景中使用的字体包含的所有字符。
DWORD fsize;
LPGLYPHSET lgp;
HDC DC:int q;
int i;int j;wchar_t myChar[20000];
q=0;
DC=GetDC(GetForegroundWindow());//通过窗口句柄得到场景
fsize=GetFontUnicodeRanges(DC,NULL);
lgp=(LPGLYPHSET) malloc(fsize);
GetFontUnicodeRanges(DC,lgp);
for(i=0;i<lgp->cRanges;i++){
for(j=0;j<lgp->ranges[i].cGlyphs;j++){
myChar[q]=j+lgp->ranges[i].wcLow;//这就是包含的字符
q++;
}
}
现在我们可以正常获取了所有字符。现在看看通过索引得到字符的过程。
DWORD fsize;
LPGLYPHSET lgp;
HDC DC:int q;
int i;int j;wchar_t myChar[20000];
q=0;
DC=GetDC(GetForegroundWindow());//通过窗口句柄得到场景
fsize=GetFontUnicodeRanges(DC,NULL);
lgp=(LPGLYPHSET) malloc(fsize);
GetFontUnicodeRanges(DC,lgp);
for(i=0;i<lgp->cRanges;i++){
for(j=0;j<lgp->ranges[i].cGlyphs;j++){
myChar[q]=j+lgp->ranges[i].wcLow;//这就是包含的字符
GetGlyphIndices(DC,myChar[q],1,&gp,1);
if(gp==114) MessageBoxW(NULL,L”成功获取了字符,这个字符就是myChar”,L”哈哈”,MB_OK);
q++;
}
}
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=683
一条评论
http://blog.csdn.net/shuilan0066/article/details/7535422