精华内容
下载资源
问答
  • TTF字体

    2013-08-21 16:15:18
    TTF字体:TrueType Font ,由Apple和微软公司合作推出的文字文件格式;  一个TTF字符由许多轮廓组成,每一个轮廓由一个名叫TTPOLYGONHEADER的数据结构开始,跟在TTPOLYGONHEADER后面的是一系列的TTPOLYCURVE数据...

             TTF字体:TrueType Font ,由Apple和微软公司合作推出的文字文件格式;

            一个TTF字符由许多轮廓组成,每一个轮廓由一个名叫TTPOLYGONHEADER的数据结构开始,跟在TTPOLYGONHEADER后面的是一系列的TTPOLYCURVE数据结构体。轮廓的顶点是POINTFX类型的数据结构点。

    TTPOLYGONHEADER的结构如下:

    typedef struct _TTPOLYGONHEADER {   
      DWORD   cb;                      //描述字符要求的字节数   
      DWORD   dwType;                  //指定返回的字符轮廓类型:TT_POLYGON_TYPE   
      POINTFX pfxStart;                //指定字符轮廓的起点    
    } TTPOLYGONHEADER, *LPTTPOLYGONHEADER;

     

    TTPOLYCURVE的结构如下:

    typedef struct tagTTPOLYCURVE { 
      WORD    wType; //指定描述字符轮廓的线类型:TT_PRIM_LINE, TT_PRIM_QSPLINE, TT_PRIM_CSPLINE 
      WORD    cpfx;  //指定结构中含有POINTFX的个数
      POINTFX apfx[1]; //指定字体中保留的polyline和Bzier spline
    } TTPOLYCURVE, *LPTTPOLYCURVE; 


    POINTFX的结构如下:

    typedef struct tagPOINTFX { 
      FIXED x; //x-component of a point on the outline of a TrueType character 
      FIXED y; //y-component of a point on the outline of a TrueType character
    } POINTFX, *LPPOINTFX; 



     

    在TTF字体结构中描述了TTF字体数据组成,在这里通过GLYPHMETRICS来了解TTF字体结构。理解可能有所偏差,详细情况参考MSDN。

    GLYPHMETRICS的结构如下:

    typedef struct _GLYPHMETRICS { 
      UINT  gmBlackBoxX;     //指定完全包围字体结构的最小矩阵的宽度 
      UINT  gmBlackBoxY;     //指定完全包围字体结构的最小矩阵的高度
      POINT gmptGlyphOrigin; //指定完全包围字体结构的最小矩阵左上角的点坐标
      short gmCellIncX;      //指定当前的起点到下一个字符的起点的水平距离
      short gmCellIncY;      //...垂直距离 
    } GLYPHMETRICS, *LPGLYPHMETRICS; 
    
    


     

     

     

            TrueType字体中的字符轮廓由直线和二次贝塞尔曲线片段所构成。Windows系统提供了API函数GetGlyphOutline()来获取字符的轮廓。函数通过字符Code确定一个字符在TTF字库中的结构,并取出字符Code所对应的数据。下面简单说明下函数的结构和字符轮廓获取的实现代码。

        GetGlyphOutline()函数结构:

    DWORD GetGlyphOutline(UINT nChar,       //需要获取字符
                          UINT nFormat,     //获取字符的格式
                          LPGLYPHMETRICS lpgm,//获取字符的相关信息
                          DWORD cbBuffer,	//保存字符数据缓冲区的大小
                          LPVOID lpBuffer,	//保存字符数据的缓冲区
                          const MAT2* lpmat2 //变换矩阵
    )const;


     

    使用GetGlyphOutline()函数获取字符轮廓实现:

    HDC hDC = pDC->GetSafeHdc();
    //创建字体
    CFont font;
    VERIFY(font.CreateFont(m_iFontHeight, 0, 0, 0,FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET,OUT_DEFAULT_PRECIS, 			     CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS,m_sFontFaceName));
    CFont *pOldFont = pDC->SelectObject(&font);
    //定义并初始化变换矩阵
    MAT2 mat2;										
    memset(&mat2, 0, sizeof(mat2));
    mat2.eM11 = 1;
    mat2.eM22 = 1;
    
    GLYPHMETRICS metrics;    //保存字符相关信息
    DWORD dwDataSize = 0;	//初始化字符数据缓冲区大小
    	
    //……
    
    //通过函数GetGlyphOutline()确定存储字符结构的空间
    dwDataSize = pDC->GetGlyphOutline(nChar, GGO_NATIVE, &metrics, 0, NULL, &mat2);
    if ((dwDataSize != 0) && (dwDataSize != GDI_ERROR))
    {
    	//创建保存字符数据缓冲区大小
    	LPBYTE pPixels = new BYTE[dwDataSize];					
    	ASSERT( pPixels != NULL );
    	TTPOLYGONHEADER *pHeader = (TTPOLYGONHEADER*)pPixels;
    	dwDataSize = pDC->GetGlyphOutline(nChar,GGO_NATIVE,&metrics, dwDataSize, pPixels, &mat2);
    	while(dwDataSize > 0)
    	{
    		//计算字符轮廓的起点,转换坐标
    		int xOld = MapFXY(pHeader->pfxStart.x);
    		int yOld = MapFXY(pHeader->pfxStart.y);
    		//根据TTF字体结构获取字符轮廓
    		::MoveToEx(hDC,iXpos + xOld,iYpos - yOld,NULL);
    		TTPOLYCURVE *pCurrentCurve = (TTPOLYCURVE*)(pHeader + 1);  
    		int remainByte = pHeader->cb - sizeof(TTPOLYGONHEADER);
    		while (remainByte > 0)
    		{
    			CPoint lpPoint[1000];
    			CPoint bezi[2];
    			int index;
    			for (index = 0; index < pCurrentCurve->cpfx; ++index)
    			{
    				lpPoint[index].x = iXpos + MapFXY(pCurrentCurve->apfx[index].x);
    				lpPoint[index].y = iYpos - MapFXY(pCurrentCurve->apfx[index].y);
    			}		
    			switch (pCurrentCurve->wType)
    			{
    			case TT_PRIM_LINE:
    			case TT_PRIM_QSPLINE:
    			for (index =0; index < pCurrentCurve->cpfx; index++)
    			{
    				::LineTo(hDC,lpPoint[index].x,lpPoint[index].y);
    			}
    			break;
    			default:
    			MessageBox(_T("字体不支持"));
    			break;
    			}
    			int count = sizeof(TTPOLYCURVE) + (pCurrentCurve->cpfx -1)*sizeof(POINTFX);
    			pCurrentCurve = (TTPOLYCURVE*)((char*)pCurrentCurve  + count);
    
    			remainByte -= count;
    			}
    		::LineTo(hDC,iXpos + xOld, iYpos - yOld);
    		dwDataSize -= pHeader->cb;
    		pHeader = (TTPOLYGONHEADER*)((char*)pHeader + pHeader->cb);
    	}
    	delete [] pPixels;
    	}
        }


            这段代码根据TTF字体的结构数据描绘字符轮廓曲线,粗糙的使用了lineto完成了曲线的绘制,如果为了是字符轮廓的曲线更加的精确,可以使用绘制二次贝塞尔曲线的函数来绘制字符的轮廓。

     

    展开全文
  • ttf字体包瘦身,ttf字体包提取字体

    ttf字体包瘦身

    注:此方法只试用于只需要少数字体的情况。

    需求

    做APP时出现了一个需求,应用登录页面和主页面的系统名称需要根据用户所属行政区划进行动态调节。
    为了突出系统名和样式的美观,系统名在显示时使用了华文琥珀字体。

    有了此需要,在应用打包时就需要将华文琥珀字体的ttf文件添加到项目中。

    问题

    在项目中添加该ttf文件后,整个安装包提交直接曾加了将近3M。
    这就有些得不偿失了,我们需要的就几个行政区划的名字,结果需要将所有字体打包,体积不暴增才怪。

    那就需要将不需要的字体排除,只将需要的字体打包进ttf文件就可已解决问题。

    处理过程

    准备工作

    • 下载好完整版华文琥珀字体的.ttf文件。

    • 下载好fontcreator字体编辑器。

    开始操作

    1. 在fontcreator中打开完整版字体文件。

    2. 在fontcreator中新建瘦身版文件。

    3. 打开在线字符编码查询,查找指定字体的编码。
      这里写图片描述

    4. 在fontcreator完整版字体中查找字体编码对应的字体并拷贝它。这里写图片描述

    5. 在压缩版中插入新字体并把刚刚拷贝的字体复制上去,并设置字体编码。
      这里写图片描述
      这里写图片描述

    6. 根据自己的需求重复第3、4、5步骤。
      这里写图片描述注意:要在瘦身文件前默认出入一个空值且编码为0的字体,不然瘦身包使用时会有渲染不上的情况。

    7. 保存果实
      所有需要的字体都拷贝完成后保存瘦身文件即可得到小号的ttf文件了。
      这里写图片描述
      这里写图片描述
      ttf文件从3621kb,变为11kb,瘦身成功。


    文中相关地址:
    华文琥珀.ttf下载
    fontcreator字体编辑器下载
    在线字符编码查询

    展开全文
  • 可以对TTF字体库进行裁剪,保留自己需要的部分字符,从而大大减小字库的大小,适合移动开发。同时支持TTC格式转TTF格式。
  • TTF字体库裁剪&TTC转TTF字体工具

    热门讨论 2013-03-23 16:32:28
    可以对TTF字体库进行裁剪,保留自己需要的部分字符,从而大大减小字库的大小,适合移动开发。同时支持TTC格式转TTF格式。
  • ttf字体集合

    2018-09-15 15:34:57
    ttf字体集合
  • TTF字体集合

    2019-02-01 14:45:41
    从CSDN以及其他地方下载的TTF字体集合,欢迎下载。
  • ttf字体模板

    2018-07-19 10:39:10
    ttf字体格式,方便大家使用,TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字体文件格式,随着windows的流行,已经变成最常用的一种字体文件表示方式。
  • Monaco.ttf字体

    2019-09-03 18:45:30
    Monaco.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_...

    获取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来提取, 但是要做一些处理来对齐文字的显示.

     

     

    展开全文
  • simsun.ttf 宋体 ttf字体文件,完美解决textpdf 无法显示中文问题
  • fireflysung.ttf 字体

    2018-04-23 15:34:40
    fireflysung.ttf 字体
  • simsun.ttf 字体

    2018-01-26 17:33:16
    simsun.ttf 字体, 看看有没有用。 好用的 simsun.ttf 字体,看看有没有用。
  • TTF字体各种字体

    热门讨论 2011-09-10 01:33:16
    TTF字体.....~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • ttf字体文件

    2016-07-22 11:50:07
    TTF字体文件,包括:微软雅黑、谐体、线体等等
  • TTF字体轮廓解析与绘制 1.1 数据提取 void CHYTTFCharacter::InitTTPOLY() { if(0 == m_pTTPOLYData) // GetGlyphOutline提取到的字体轮廓数据 { return; } TTPOLYGONHEADER* pTTPOLYGONHEADER = 0; ...

    一. TTF字体轮廓解析与绘制

    1.1 数据提取

    void CHYTTFCharacter::InitTTPOLY()
    {
    	if(0 == m_pTTPOLYData)			// GetGlyphOutline提取到的字体轮廓数据
    	{
    		return;
    	}
    	TTPOLYGONHEADER* pTTPOLYGONHEADER = 0;
    	TTPOLYCURVE* pTTPOLYCURVE = 0;
    	STTTPOLYGONHEADER* pSTTTPOLYGONHEADER = 0;
    	STTTPOLYCURVE* pSTTTPOLYCURVE = 0;
     
    	unsigned int nTTPOLYDataLen = 0;
    	unsigned char* pTTPOLYData = m_pTTPOLYData;
     
    	unsigned int nCURVELen = 0;
    	unsigned char* pCURVE = 0;
     
    	int nTemp = 0;
     
    	while(nTTPOLYDataLen < m_nTTPOLYDataLen)
    	{
    		pSTTTPOLYGONHEADER = new STTTPOLYGONHEADER;
    		m_stTTPOLYGONHEADERVector.push_back(pSTTTPOLYGONHEADER);
     
    		pTTPOLYGONHEADER = (TTPOLYGONHEADER*)pTTPOLYData;
    		memcpy(&(pSTTTPOLYGONHEADER->m_TTPOLYGONHEADER), pTTPOLYGONHEADER, sizeof(TTPOLYGONHEADER));
     
    		pCURVE = pTTPOLYData + sizeof(TTPOLYGONHEADER);
    		nCURVELen = sizeof(TTPOLYGONHEADER);
     
    		while(nCURVELen < pTTPOLYGONHEADER->cb)
    		{
    			pTTPOLYCURVE = (TTPOLYCURVE*)pCURVE;
     
    			pSTTTPOLYCURVE = new STTTPOLYCURVE;
    			pSTTTPOLYCURVE->Init(pTTPOLYCURVE->wType, pTTPOLYCURVE->cpfx);
    			pSTTTPOLYGONHEADER->m_stTTPOLYCURVEVector.push_back(pSTTTPOLYCURVE);
     
    			memcpy(pSTTTPOLYCURVE->m_p_apfx, pCURVE + sizeof(TTPOLYCURVE) - sizeof(POINTFX), 
    				sizeof(POINTFX) * pTTPOLYCURVE->cpfx);
    			
    			nTemp = sizeof(TTPOLYCURVE) + sizeof(POINTFX) * (pTTPOLYCURVE->cpfx - 1);
    			pCURVE += nTemp;
    			nCURVELen += nTemp;
    		}
     
    		nTTPOLYDataLen += pTTPOLYGONHEADER->cb;
    		pTTPOLYData += pTTPOLYGONHEADER->cb;
    	}
    }

    1.2 绘制

    void CHYTTFCharacter::Draw(HDC hDC, int nOffsetX, int nOffsetY)
    {
    	int nXTemp, nYTemp, nXBegin, nYBegin;
    	STTTPOLYGONHEADER* pSTTTPOLYGONHEADER = 0;
    	STTTPOLYCURVE* pSTTTPOLYCURVE = 0;
    	int nCountH = m_stTTPOLYGONHEADERVector.size();
    	int nCountC = 0;
    	int i = 0, j = 0, k = 0;
    	for(i = 0; i < nCountH; ++i)
    	{
    		pSTTTPOLYGONHEADER = m_stTTPOLYGONHEADERVector[i];
    		nXBegin = nOffsetX + FIXEDToInt(pSTTTPOLYGONHEADER->m_TTPOLYGONHEADER.pfxStart.x);
    		nYBegin = nOffsetY - FIXEDToInt(pSTTTPOLYGONHEADER->m_TTPOLYGONHEADER.pfxStart.y);
    		::MoveToEx(hDC, nXBegin, nYBegin, NULL);
     
    		nCountC = pSTTTPOLYGONHEADER->m_stTTPOLYCURVEVector.size();
    		for(j = 0; j < nCountC; ++j)
    		{
    			pSTTTPOLYCURVE = pSTTTPOLYGONHEADER->m_stTTPOLYCURVEVector[j];
    			// 这里可以根具线条的类型做样条曲线的绘制, 这样字体会绘制的比较圆滑.***********注意注意*****************
    			// 我这里直接使用直线连接, 有些地方可能绘制的比较粗糙.************************注意注意******************
    			for(k = 0; k < pSTTTPOLYCURVE->m_cpfx; ++k)
    			{
    				::LineTo(hDC, nOffsetX + FIXEDToInt(pSTTTPOLYCURVE->m_p_apfx[k].x), 
    					nOffsetY - FIXEDToInt(pSTTTPOLYCURVE->m_p_apfx[k].y));
    			}
    		}
    		::LineTo(hDC, nXBegin, nYBegin);
    	}
    }

    1.3 调用

    void CTestTypeDlg::PaintType()
    {
    	CClientDC dc(this);
    	HDC hDC = dc.GetSafeHdc();
    	//创建字体
    	CFont font;
    	VERIFY(font.CreateFont(70, 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;
     
    	GLYPHMETRICS metrics;		// 保存字符相关信息
    	DWORD dwDataSize = 0;		// 初始化字符数据缓冲区大小
    		
    	//……
     
    	// 通过函数GetGlyphOutline()确定存储字符结构的空间
    	//char nChar = 'A';
    	wchar_t nChar = L'A';
    	::TextOut(dc.m_hDC, 0, 0, "A", 1);
     
    	//dwDataSize = pDC->GetGlyphOutline((UINT)nChar, GGO_NATIVE, &metrics, 0, NULL, &mat2);
    	dwDataSize = ::GetGlyphOutlineW(dc.m_hDC, (UINT)nChar, GGO_NATIVE, &metrics, 0, NULL, &mat2);
    	if ((dwDataSize != 0) && (dwDataSize != GDI_ERROR))
    	{
    		CHYTTFCharacter hyTTFCharacter;
    		hyTTFCharacter.InitTTPOLY(dwDataSize);
    		dwDataSize = ::GetGlyphOutlineW(dc.m_hDC, (UINT)nChar,GGO_NATIVE,&metrics, dwDataSize, hyTTFCharacter.m_pTTPOLYData, &mat2);
     
    		hyTTFCharacter.InitTTPOLY();
    		int nXOffset = 200;
    		int nYOffset = 200;
    		
    		hyTTFCharacter.Draw(dc.m_hDC, nXOffset, nYOffset);
    	}
    }

    1.4 网上的一些参考

    http://blog.csdn.net/kingstar158/article/details/7257347

    HDC hDC = pDC->GetSafeHdc();
    //创建字体
    CFont font;
    VERIFY(font.CreateFont(m_iFontHeight, 0, 0, 0,FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET,OUT_DEFAULT_PRECIS, 			     CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS,m_sFontFaceName));
    CFont *pOldFont = pDC->SelectObject(&font);
    //定义并初始化变换矩阵
    MAT2 mat2;										
    memset(&mat2, 0, sizeof(mat2));
    mat2.eM11 = 1;
    mat2.eM22 = 1;
     
    GLYPHMETRICS metrics;    //保存字符相关信息
    DWORD dwDataSize = 0;	//初始化字符数据缓冲区大小
    	
    //……
     
    //通过函数GetGlyphOutline()确定存储字符结构的空间
    dwDataSize = pDC->GetGlyphOutline(nChar, GGO_NATIVE, &metrics, 0, NULL, &mat2);
    if ((dwDataSize != 0) && (dwDataSize != GDI_ERROR))
    {
    	//创建保存字符数据缓冲区大小
    	LPBYTE pPixels = new BYTE[dwDataSize];					
    	ASSERT( pPixels != NULL );
    	TTPOLYGONHEADER *pHeader = (TTPOLYGONHEADER*)pPixels;
    	dwDataSize = pDC->GetGlyphOutline(nChar,GGO_NATIVE,&metrics, dwDataSize, pPixels, &mat2);
    	while(dwDataSize > 0)
    	{
    		//计算字符轮廓的起点,转换坐标
    		int xOld = MapFXY(pHeader->pfxStart.x);
    		int yOld = MapFXY(pHeader->pfxStart.y);
    		//根据TTF字体结构获取字符轮廓
    		::MoveToEx(hDC,iXpos + xOld,iYpos - yOld,NULL);
    		TTPOLYCURVE *pCurrentCurve = (TTPOLYCURVE*)(pHeader + 1);  
    		int remainByte = pHeader->cb - sizeof(TTPOLYGONHEADER);
    		while (remainByte > 0)
    		{
    			CPoint lpPoint[1000];
    			CPoint bezi[2];
    			int index;
    			for (index = 0; index < pCurrentCurve->cpfx; ++index)
    			{
    				lpPoint[index].x = iXpos + MapFXY(pCurrentCurve->apfx[index].x);
    				lpPoint[index].y = iYpos - MapFXY(pCurrentCurve->apfx[index].y);
    			}		
    			switch (pCurrentCurve->wType)
    			{
    			case TT_PRIM_LINE:
    			case TT_PRIM_QSPLINE:
    			for (index =0; index < pCurrentCurve->cpfx; index++)
    			{
    				::LineTo(hDC,lpPoint[index].x,lpPoint[index].y);
    			}
    			break;
    			default:
    			MessageBox(_T("字体不支持"));
    			break;
    			}
    			int count = sizeof(TTPOLYCURVE) + (pCurrentCurve->cpfx -1)*sizeof(POINTFX);
    			pCurrentCurve = (TTPOLYCURVE*)((char*)pCurrentCurve  + count);
     
    			remainByte -= count;
    			}
    		::LineTo(hDC,iXpos + xOld, iYpos - yOld);
    		dwDataSize -= pHeader->cb;
    		pHeader = (TTPOLYGONHEADER*)((char*)pHeader + pHeader->cb);
    	}
    	delete [] pPixels;
    	}
        }

    二. 应用

            TTF字体是一种矢量字体. 好处就是可以随便放大, 缩小, 旋转等. 例如做"仿射变换". 而对于位图字体, 如果位图字体很大时, 做这些变换都是对位图上的每一个点来操作的, 效率会很低. 而如果对矢量数据操作的话, 要操作的点是有限的(比位图操作的点要少很多). 所以当你提取到了TTF字体的轮廓数据后, 你想干嘛都可以了(做一些文字的二维处理, 三维处理等都可以)..

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • ttf字体.zip

    2019-07-26 12:39:59
    ttf字体,华文彩云、华文仿宋、华文行楷、华文宋体

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,431
精华内容 3,372
关键字:

ttf字体