從ttf字型中字模資訊
1、引言
傳統上的字模資訊一般都是從點陣字型中得到的。然而,點陣字型有乙個致命的缺點就是字模資訊大小固定,放大字型將產生嚴重的鋸齒形失真。本文介紹了一種利用vc從ttf字型中直接獲取字元的字模資訊的方法,所獲取的字模資訊可以達到近似無限的解析度,可選擇2級、5級、17級和65級等多種灰度級,最終將字模資訊儲存為bmp位**件格式,方便對字模資訊的利用。
2、ttf介紹
3、提取ttf字型中字元的字模資訊
首先,把所要用的ttf字型庫選入當前的dc(device context)裝置上下文中
cfont newfont;接下來主要是利用win32的api函式getglyphoutline()來提取ttf字型的字模資訊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中
dword getglyphoutline(若接收快取的位址設定為null則getglyphoutline()函式返回字模資訊所需的儲存空間的大小。若返回的儲存空間大小nlen大於零,則可以獲取指定的字模資訊,否則,表示返回失敗,需重新設定字型。對getglyphoutline()函式的第三個引數uformat分別設定為ggo_bitmap,ggo_gray2_bitmap,ggo_gray4_bitmap,ggo_gray8_bitmap就可以獲取2級、5級、17級和65級灰度的字模資訊。返回的字型資訊是按行進行4位元組對齊的,必須經過適當處理以獲取字模的大小對於2級灰度的字模資訊,1位表示乙個畫素,所示字模的寬度(按位元組計)為hdc hdc, // dc控制代碼
uint uchar, // 要提取字模的字元
uint uformat, // 函式返回的資訊格式
lpglyphmetrics lpgm, // glyphmetrics結構的指標
dword cbbuffer, // 接收快取的大小
lpvoid lpvbuffer, // 接收快取的位址
const mat2 *lpmat2 // mat2結構的指標
);
charlinew=(glpm.gmblackboxx/32+(glpm.gmblackboxx%32==0?0:1))*4;對於5級、17級和65級灰度的字模資訊,1位元組表示乙個畫素,所以字模的寬度(按位元組計)為// glpm為返回的lpglyphmetrics結構體
charlinew=(glpm.gmblackboxx/4+(glpm.gmblackboxx%4==0?0:1))*4;4、字模資訊的顯示與儲存
所獲取的字模資訊為一畫素矩陣,可以用位圖來顯示與儲存為了顯示和儲存位圖,須構造點陣圖的資訊頭結構體bitmapinfo,該結構體在msdn上有說明,主要是用來解析bmp格式的位**件的。根據字模資訊的灰度級數,設定不同的顏色數,如果為2級則為黑白兩色。若是5級、17級和65級灰度,則在0~255中平均分配不同的灰度。顯示點陣圖時利用了顯示快取來加快字型的顯示,即在記憶體中申請一空間,將字模資訊繪於此空間,然後將其整個「貼」到顯示介面上。
crect rect;如果要儲存字模資訊為bmp位**件,需構造位**件的檔案頭結構體bitmapfileheader。 然後,新建一檔案,寫入點陣圖的各種資訊即可。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
cfile cf;5、程式的執行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();
整個程式實現了從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...