從TTF字型中字模資訊

2021-07-25 13:38:41 字數 3378 閱讀 8564

從ttf字型中字模資訊

1、引言

傳統上的字模資訊一般都是從點陣字型中得到的。然而,點陣字型有乙個致命的缺點就是字模資訊大小固定,放大字型將產生嚴重的鋸齒形失真。本文介紹了一種利用vc從ttf字型中直接獲取字元的字模資訊的方法,所獲取的字模資訊可以達到近似無限的解析度,可選擇2級、5級、17級和65級等多種灰度級,最終將字模資訊儲存為bmp位**件格式,方便對字模資訊的利用。

2、ttf介紹

3、提取ttf字型中字元的字模資訊

首先,把所要用的ttf字型庫選入當前的dc(device context)裝置上下文中

cfont newfont;

newfont.createfont(m_intheight,

0, m_intangle,

0, m_intbold,

m_bcheckitalic,

0,0,

default_charset,

out_character_precis,

clip_character_precis,

default_quality,

default_pitch|ff_dontcare,

m_strfontname); //m_strfontname為ttf字型名

//m_intheight設定字型的高度,值越大,最終獲取的字模的解析度越高。

//m_intangle設定字型的旋轉角度,m_intbold設定字型的粗細程度

//m_bcheckitalic設定字型為斜體與否

cdc* pdc=m_ctldisplay.getdc();//獲取控制項m_ctldisplay的dc

cfont *poldfont=pdc->selectobject(&newfont);//將ttf字型物件選入控制項m_ctldisplay的dc中

接下來主要是利用win32的api函式getglyphoutline()來提取ttf字型的字模資訊
dword getglyphoutline(

hdc hdc, // dc控制代碼

uint uchar, // 要提取字模的字元

uint uformat, // 函式返回的資訊格式

lpglyphmetrics lpgm, // glyphmetrics結構的指標

dword cbbuffer, // 接收快取的大小

lpvoid lpvbuffer, // 接收快取的位址

const mat2 *lpmat2 // mat2結構的指標

);

若接收快取的位址設定為null則getglyphoutline()函式返回字模資訊所需的儲存空間的大小。若返回的儲存空間大小nlen大於零,則可以獲取指定的字模資訊,否則,表示返回失敗,需重新設定字型。對getglyphoutline()函式的第三個引數uformat分別設定為ggo_bitmap,ggo_gray2_bitmap,ggo_gray4_bitmap,ggo_gray8_bitmap就可以獲取2級、5級、17級和65級灰度的字模資訊。返回的字型資訊是按行進行4位元組對齊的,必須經過適當處理以獲取字模的大小對於2級灰度的字模資訊,1位表示乙個畫素,所示字模的寬度(按位元組計)為
charlinew=(glpm.gmblackboxx/32+(glpm.gmblackboxx%32==0?0:1))*4;

// glpm為返回的lpglyphmetrics結構體

對於5級、17級和65級灰度的字模資訊,1位元組表示乙個畫素,所以字模的寬度(按位元組計)為
charlinew=(glpm.gmblackboxx/4+(glpm.gmblackboxx%4==0?0:1))*4;
4、字模資訊的顯示與儲存

所獲取的字模資訊為一畫素矩陣,可以用位圖來顯示與儲存為了顯示和儲存位圖,須構造點陣圖的資訊頭結構體bitmapinfo,該結構體在msdn上有說明,主要是用來解析bmp格式的位**件的。根據字模資訊的灰度級數,設定不同的顏色數,如果為2級則為黑白兩色。若是5級、17級和65級灰度,則在0~255中平均分配不同的灰度。顯示點陣圖時利用了顯示快取來加快字型的顯示,即在記憶體中申請一空間,將字模資訊繪於此空間,然後將其整個「貼」到顯示介面上。

crect rect;

getdlgitem(idc_static_pic)->getwindowrect(&rect); //獲取顯示控制項的大小

cdc memdc; //申請一顯示快取的dc(device context,裝置上下文 )memdc.createcompatibledc(pdc);

cbitmap nbitmap,*poldbitmap;

nbitmap.createcompatiblebitmap(pdc,rect.width(),rect.height());

//建立合適的點陣圖

poldbitmap=memdc.selectobject(&nbitmap); //將所建立的點陣圖選入顯示快取的dc

::stretchdibits(memdc.m_hdc,

-m_intscrollhpos,

-m_intscrollvpos,

m_intpixx,

m_intpixy,0,0,

m_intpixx,

m_intpixy,

pbuf,pbmpinfo,

dib_rgb_colors,

srccopy);

//將影象資料繪於顯示快取的dc上

pdc->bitblt(0,0,rect.width(),rect.height(),&memdc,0,0,srccopy);

//將顯示快取上的影象按顯示控制項的大小」貼」到影象顯示控制項上

memdc.deletedc();//釋放顯示快取的dc

如果要儲存字模資訊為bmp位**件,需構造位**件的檔案頭結構體bitmapfileheader。 然後,新建一檔案,寫入點陣圖的各種資訊即可。
cfile cf;

cf.open(strfile,cfile::modecreate|cfile::modewrite);

cf.write(pfileinfo,sizeof(bitmapfileheader));//寫入檔案頭資訊

cf.write(pbmpinfo,sizeof(bitmapinfoheader)+sizeof(rgbquad)*bitstable[m_intbits-1]);

//寫入點陣圖的資訊頭和顏色表

cf.write(pbuf,charlinew*m_intpixy);//寫入位圖資料

cf.close();

5、程式的執行

整個程式實現了從ttf字型中提取字模資訊並最終儲存為bmp位**件的功能。其中,ttf字型可以在字型列表中選擇,字模的高度、粗細、角度、斜體、反色和灰度級數可以選擇,適應了各種場合對字模資訊的不同要求。字模資訊最後儲存為bmp位**件,方便後繼各種針對字模應用的處理,諸如字模顯示,字模處理等。

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...

從 IE 中讀取 Cookie 資訊

從 ie 中讀取 cookie 資訊 我們首先正常登入到系統中,就會在客戶端產生正常的 cookie 資訊。需要引用兩個 com 元件 1 micrisoft internet controls 1.1,即 shdocvw。這個元件,如果在指令碼中執行時,直接匯入 c windows system3...

從C 中讀取硬體以及系統資訊

using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.text using system.window...