windows矢量字体点阵数据的提取(转)

源:windows矢量字体点阵数据的提取

1.提取原理

  在windows系统当中提取矢量字体的字模有很多方法,下面介绍一种利用GetGlyphOutline来实现字模点数数据的提取。

GetGlyphOutline是windows系统的API函数,利用这个函数,可以方便快捷提取矢量字体字符点阵数据,并且可以很好的支持从文本文件中读取字符。面对用大量字符数据输入时,获取点阵数据所需要的时间量也是很少。

GetGlyphOutline函数声明如下:

DWORD GetGlyphOutline(
HDC hdc,             // handle to DC
  UINT uChar,          // character to query
  UINT uFormat,        // data format
  LPGLYPHMETRICS lpgm, // glyph metrics
  DWORD cbBuffer,      // size of data buffer
  LPVOID lpvBuffer,    // data buffer
  CONST MAT2 *lpmat2   // transformation matrix
);

GetGlyphOutline函数是windows系统的API函数,在使用VC++开发时,这个函数被封装在DC类中,是DC类的一个成员函数。

2.字符点阵数据提取的实现

  当应用程序调用GetGlyphOutline函数时,这个函数可以通过LPGLYPHMETRIC这个结构体指针返回我们所需要的字符点阵数据所占的矩形区域信息。该函数所得到的点阵数据是的是gmBlackBoxX与gmBlackBoxY所组成的最小矩形区域的点阵数据,如图1所示,而我们在实际应用中所需要显示的字符点阵数据却是gmCellIncX与gmCellIncY所组成的大矩形区域内的点阵数据,所以当我们调用GetGlyphOutline所得到的字符的点阵数据时,还需要把最小矩形以外的边框区域加上,这需要通过相应的的矩阵变换把最小矩形的点阵数据区平移到以gmCellIncX与gmCellIncY所组成的大矩形区域的中间位置。

在windows 操作系统当中实践表明,GetGlyphOutlinep这个函数返回的结构体LPGLYPHMETRICS中gmCellIncY这个数值返回是0,这是操作系统版本本身的原因,因此需要通过另外的方法来获取。我们采用GetTextExtent(CString,int)和GetTextMetrics(TEXTMETRIC *tm),通过以上两个函数我们可以获取字符的宽度与高度信息,然后通过相应矩阵变换的变换,就可以得到所需的字符字模点阵数据!GetGlyphOutline  函数获取的字符点阵数据的宽度是4字节对齐,所以要做4字节对齐处理。对于宽度不是以8位对齐的字符数据,应该在补足8位后,再做4字节对齐处理。获取字符点阵数据的程序如下:

CString str ( “华”);//字符
      CDC dc;//CDC 类,这个类有GetGlyphOutline这个方法
      dc.CreateDC(_T("DISPLAY"),NULL, NULL, NULL);
      CFont *poldfont=dc.SelectObject(&m_font);//字体设置
      TEXTMETRIC tm;//这是个结构体这个结构体包含了字体的信息,
GLYPHMETRICSpGL;//这个结构体包含了一个基本字符单元的位置与方向的信息
      MAT2 mat2 = {{0,1},{0, 0},{0, 0},{0, 1}};      //转换矩阵
      dc.GetTextMetrics(&tm); //获取当前选择字体宽度与高度
      int bitWidth=tm.tmAveCharWidth;//字符宽度的平均值
      int bitHeigh =tm.tmHeight;//字符高度
int ch = str.GetAt(0);
      int len =dc.GetGlyphOutline(ch,GGO_BITMAP, &pGL, 0, NULL, &mat2);//所得//到数据缓存区的大小
  CSize cs = pDC->GetTextExtent(str,1);//重新获得字符的宽度,修正值
      int widthEx =cs.cx;
      bitWidth =widthEx;
      if(bitWidth %8==0)
      {
             bitWidth= bitWidth /8; //字符宽度8位对齐,不足8位,补齐8位
      }
      else
      {
             bitWidth= bitWidth /8+1;
      }
int boxXByteWidth = ALIGN(pGL.gmBlackBoxX, 4);// 最小矩形宽度,4字节对齐
int FontOffY = tm.tmAscent - pGL.gmptGlyphOrigin.y;//获取Y方向偏移
int FontOffX = pGL.gmptGlyphOrigin.x < 0 ? 0 :pGL.gmptGlyphOrigin.x;//获取X方向偏移
int bufSize = bitWidth* bitHeigh;//字符点阵数据大小
unsigned char *pBuf =new unsigned char[bufSize];//databuf
if(pBuf != NULL)
{
             memset(pBuf, 0, bufSize);
             if(len > 0)
             {
                    unsigned char *pSrc = newunsigned char [len];
                    unsigned char *pDest =(unsigned char *)pBuf;
                    dc.GetGlyphOutline(ch, GGO_BITMAP,&pGL, len, pSrc, &mat2);//得到点阵数据
                    for(int i = 0; i < len / boxXByteWidth;i++)
                    {    //copy databuf to pDest
memcpy(pDest + i * (bitWidth/8), pSrc + i * boxXByteWidth, boxXByteWidth);
                    }
                    //转换矩阵,把GetGlyphOutline得到的点阵转换成含有边框的点阵数据
                    MartixCovert(pDest,bitWidth,bitHeigh ,FontOffX, FontOffY);
             }
}
dc.SelectObject(poldfont);
dc.DeleteDC();
delete []pSrc;
delete []pDest;

下面是点阵数据的显示效果

时间: 2024-08-07 21:20:07

windows矢量字体点阵数据的提取(转)的相关文章

基于Windows字库的点阵数据提取方法

源:基于Windows字库的点阵数据提取方法

FreeType 矢量字体 测试移植(1)

之前有做过 ascii 和汉字库的字体点阵在lcd上显示的例子,都是按照指定大小的字库的点阵来显示的,所以一但选定了字体文件后,就固定了大小,不可变化,当然也可以存放各种 大小的字体文件,但这样的话就需要很多的空间,这种方法显然不好使,所以就引入了失量字体,关于字体的特点就不啰嗦了.可以去网上搜到很多说明.下面我们一步一步的来做实验测试了解失量字体的用法,先在PC机上测试,然后再移植到开发板上用lcd显示. 一.首先我们要去获得失量字体的源码和一些文档,https://www.freetype.

Linux应用环境实战05:在Ubuntu 14.10中借用Windows的字体 (转)

阅读目录 设置系统字体 安装微软的英文字体 查看系统的配置文件 借用Windows的字体 编写配置文件 在前一篇随笔中,我详细讨论了字体的分类及用途,也以Fedora 20为例,展示了字体配置的思路和方法.我在配置Fedora 20系统字体的时候,采用的是一种釜底抽薪的方法,完全抛开了系统原有的配置文件,所有的配置从头开始.事实上,任何一个Linux发行版本身已经做了很多的字体配置工作,完全将系统默认的配置弃之不用并不是最好的办法.配置系统字体还可以采用锦上添花的方式,也就是保持系统原有的配置文

Delphi中建立指定大小字体和读取该字体点阵信息的函数(转)

源:Delphi中建立指定大小字体和读取该字体点阵信息的函数 Delphi中建立指定大小字体和读取该字体点阵信息的函数 作者:Thermometer Email:  [email protected] 由于要控制硬件,需要把矢量的汉字转化为点阵信息写入eprom或在液晶屏上显示,因此用Delphi写了如下的函数,可以把指定的一个汉字(两个字符)转化为点阵信息保存到文件,每个点对应一个二进制位,有文字信息该位为1,否则为0. 目前该函数可以生成指定大小的汉字并可读取点阵字模信息保存到文件. 如Co

运维监控大数据的提取与分析

本文内容整理来自[敏捷运维大讲堂]蒋君伟老师的线上直播分享.分别从以下3个维度来分享:1.云时代监控分析的窘境:2.使用标签标记监控数据的维度:3.监控数据应用场景. 云时代监控分析的窘境 在虚拟化与容器技术广泛应用的情况下,运维对象大规模地增长,监控平台每天存储的指标都以亿计,所以监控数据如今已经成了大数据.传统的监控工具在这种场景下,对于数据的提取分析,已经力不从心,反而成为了运维的负担. 我们用一个典型的互联网档案分析应用举例说明: 这个应用支持容灾与负载均衡,它部署在三个数据中心,并同时

Gprinter光栅位图点阵数据解析工具

最近参与的项目有一个需求,解析佳博热敏打印机的光栅位图点阵数据并保存为图片文件.数据是通过Bus Hound抓取的,如下图所示. 其中1b 40为初始化打印机的指令,对应的ASCII码为ESC @,1b 4a 18为打印并走纸的指令,对应的ASCII码为ESC J,1d 76 30为打印光栅位图的指令,对应的ASCII码为GS v 0,其后紧跟光栅位图模式(0x00).水平方向位图字节数(0x0036)和垂直方向位图点数(0x0018),后面则为本帧的位图数据(0x36*0x18=1296字节)

从Wireshark监听的数据中提取需要的数据

最近,需要将wireshark监听的数据进行提取,分两步:首先,应该得出wireshark的数据包吧,在图形化界面中可以非常直观的将监听数据进行存储,但是这样需要手动操作非常麻烦,而且容易出错(随着处理数据包的数量增加,图形化可能吃不消,以前就遇见过),在linux下,采用了tshark命令,tshark就是wireshark图形界面命令行化,命令如下: sudo tshark -f "udp port 1243" -i eth0 (-w)> /tmp/capture.cap 对

freetype显示矢量字体 -- 在LCD上测试

配置交叉编译工具连我的环境变量:/home/usr/local/arm/4.3.2/bin 解压freetype-2.4.10.tar.bz2 进入配置交叉编译工具:./configure --host=arm-linux编译  make 暂时安装到当前目录下tmp目录make DESTDIR=$PWD/tmp install 拷贝库文件到交叉编译器里:把tmp/usr/local/lib/*  复制到 /home/usr/local/arm/4.3.2/arm-none-linux-gnuea

在开发板上实现矢量字体显示

对于开发板实现显示矢量字体,同样PC机一样,我需要字体文件,这里选择simsun.ttc(新宋体). 1)初始化库  FT_Init_FreeType( &library ); /* initialize library */ 2)create face object  FT_New_Face( library, argv[1], 0, &face ); 3)设置字体大小 FT_Set_Pixel_Sizes(face, 24, 0); 4)设置坐标 pen.x = 0 * 64; pen