999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Windows矢量字體點陣數據提取的實現方法

2014-09-06 10:49:59王小亮王勇湯永科秦磊
單片機與嵌入式系統應用 2014年6期
關鍵詞:嵌入式

王小亮,王勇,湯永科 ,秦磊

(1. 四川大學 電子信息學院, 成都 610044; 2. 四川大學 電氣信息學院)

?

Windows矢量字體點陣數據提取的實現方法

王小亮1,王勇1,湯永科1,秦磊2

(1. 四川大學 電子信息學院, 成都 610044; 2. 四川大學 電氣信息學院)

字符顯示在嵌入式系統有著廣泛的應用,尤其是在沒有操作系統的嵌入式設計中,提取字符點陣數據已經成為嵌入式設計中的關鍵一步。相比于一般通過位圖方式來獲取字符點陣數據,本文介紹了如何利用Windows操作系統提供API函數提取矢量字體點陣數據的方法,程序可以方便快速提取Windows系統所安裝的所有矢量字體的點陣數據。程序界面簡潔美觀,功能強大,實用性強。

嵌入式系統;矢量字體;點陣;快速;API

引 言

隨著顯示技術日新月異的發展,各種性能的顯示器越來越廣泛地運用于嵌入式產品中。用戶界面友好已經成為一個產品能否獲得成功至關重要的因素。在Windows 操作系統中,系統本身為用戶提供了各種豐富的矢量字體,同時用戶也可以通過簡單地安裝相應的字體文件,然后在編輯軟件中點擊相應的按鍵就可以使用各種矢量字體。因為PC系統中,可以非常方便和快捷地獲取各種矢量字體,所以在嵌入式系統開發設計中,我們會思考如何利用Windows系統所提供的豐富的矢量字體來獲取所需要的點陣數據。本文利用Windows 提供的API函數,設計實現了矢量字體字模提取的工具軟件。

1 矢量字體

在紙上寫字時,我們需要在紙上把字符的所有的點都畫出來,這樣就完成了字符的書寫。計算機顯示字符也是通過把字符輪廓中相應的點陣數據顯示在顯示器上,從而實現計算機“書寫”功能。計算機所顯示的字符點陣數據是通過一定的方式預先儲存在計算機系統的文件中,當操作系統需要顯示字符時,通過相應程序去查找對應的點陣數據,然后達到顯示字符的效果。

矢量字體(vector font)中每一個字形是通過數學曲線來描述的,它包含了字形邊界上的關鍵點,連線的導數信息等,字體的渲染引擎通過讀取這些數學矢量,然后進行一定的數學運算來進行渲染。這類字體的優點是,字體實際尺寸可以任意縮放而不變形、變色。矢量字體主要包括Type1、 TrueType、OpenType等幾類,這些格式都是與平臺無關的。由于矢量字體具有以上各種優勢,所以在嵌入式產品的人機界面設計中有著廣泛的應用。

2 提取原理

在Windows 系統當中提取矢量字體的字模,一般有兩種方法。

一種方法,通過截取字體在當前Windows系統DC設備當中的位圖,然后根據位圖的像素元素提取相應的點陣數據。當字符數目比較多的時候,這種方法的缺點是提取速度慢,需要通過程序處理大量的圖片像素數據來獲取字符點陣。這種方法無論是從時間、空間還是內存空間來看,對系統的消耗都是非常大的。同時,如果用戶輸入的字符數量非常大時,軟件界面需要提供比較大的輸入區以方便用戶輸入,所以這種提取方式對于程序輸入界面有比較高的要求,且不易支持直接從文本文件直接輸入字符。

另一種方法是利用Windows系統的API函數GetGlyphOutline,該函數可以方便快捷地提取矢量字體字符點陣數據,并且可以很好地支持從文本文件中讀取字符。面對大量字符數據輸入時,獲取點陣數據所需要的時間量也很少。GetGlyphOutline函數聲明如下:

DWORD GetGlyphOutline(

HDC hdc,

// handler 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類的一個成員函數。

3 字符點陣數據提取的實現

當應用程序調用GetGlyphOutline 函數時,該函數可以通過LPGLYPHMETRIC結構體指針返回所需的字符點陣數據所占的矩形區域信息。該函數所得到的點陣數據是gmBlackBoxX與gmBlackBoxY所組成的最小矩形區域的點陣數據,如圖1所示。實際應用中,所需要顯示的字符點陣數據卻是gmCellIncX與gmCellIncY所組成的大矩形區域內的點陣數據,所以調用GetGlyphOutline所得到的字符的點陣數據時,還需要把最小矩形以外的邊框區域加上,這需要通過相應的矩陣變換把最小矩形的點陣數據區平移到以gmCellIncX與gmCellIncY所組成的大矩形區域的中間位置。

圖 1

在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;

//這個結構體包含了字體的信息

GLYPHMETRICS pGL;

//這個結構體包含了一個基本字符單元的位置與方向的信息

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位

}

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 = new unsigned 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;

圖 3

4 軟件總體設計

通過上文分析已經得到單個字符的點陣數據,然而在實際應用當中,獲取單個字符的點陣數據是沒有實用性的,所以在上文的基礎上,利用VC++開發工具,開發了實用的字模點陣數據提取軟件。軟件支持兩種字符輸入方式,一是通過VC++中的CEdit類來接收用戶直接輸入的字符,二是利用CStdioFile類來實現文本文件的輸入;利用CString類對通過以上兩種方式輸入獲取字符進行串化處理(用CString保存),同時利用CFont類實現對用戶對字體格式修改操作,然后對所得到的字符串做空格過濾處理;最后根據上文介紹的方法獲取字符串中每一個字符的點陣數據。對于獲取到的點陣數據作輸出格式化處理,為其加上相應的數據信息頭,并用“{}”框起,結尾處加上“;”,以實現符合C語言中變量聲明方式,這樣在實際應用當中只需修改文本文件的后綴名,在文件中加上相關的變量聲明就可以在直接在實現工程中應用。

為了把軟件開發成為通用性強的應用軟件,本軟件在提取字符點陣數據的基礎上增加了提取圖像像素數點陣的功能。這個功能是以圖像文件操作為基礎,可以支持PNG、BMP、JPEG等圖像文件輸入,提供用戶創建圖像文件的功能,同時支持用戶的繪圖操作。軟件總體運行流程如圖2所示,軟件運行界面如圖3所示。

圖 2

5 驗證與測試

為了測試軟件功能,在開發過程加入了測試驗證環節。啟動軟件后,點擊字體設置,設置字符格式為華文行楷,字符大小為72磅,在字符輸入區輸入“華文行楷”4個漢字,點擊生成字模,在輸出區得到了這4個漢字的點陣字模數據。然后點擊生成文件,把所得到的字模點陣數據另存為文本文件。打開所得到的文本文件,在文件中加上變量的聲明,修改文本文件名的后綴名(.txt)為C語言的頭文件格式(.h)。在集成開發環境加添加所得到的變量頭文件,編譯通過后下載到硬件平臺。在測試中采用的硬件平臺是天嵌科技公司推出的TQ2440ARM9開發板,通過其提供的測試程序加以修改,把軟件提取得到的字符點陣數據按行掃描顯示,測試程序主要代碼實現如下:

void PointDataTest(

unsigned int x_p, //字符顯示的x坐標

unsigned int y_p, //字符顯示的y坐標

unsigned int width, //字符的寬度

unsigned int hight, //字符的高度

unsigned char *pData){ //指向點陣數據區的指針

int x = 0;

int y = 0;

int i = 0;

for(y = y_p; y

for(x = x_p; x

for(i=0; i<8; i++){

if(pData[(y-y_p)*(width/8)+x-x_p] & (0x80>>i)){

PutPixel(x_p+(x-x_p)*8+i, y, 0x00ff00);

//畫點函數

}

}

}

}

}

測試結果如圖4所示。通過測試結果顯示的字符與開發軟件的字符輸入區輸入的字符對比,可以看出軟件功能滿足設計要求。

圖 4

結 語

[1] Stephen Prata. C++ Primer Plus[M]. 北京:人民郵電出版社, 2012:564-623.

[2] Petxold. Programming Windows[M]. 北京:清華大學出版社, 2010:769-838.

[3] Jeff Prosise. MFC Windows 程序設計[M]. 北京:清華大學出版社, 1999:757-820.

[4] 孫鑫. VC++深入詳解[M]. 北京:電子工業出版社, 2006:135-161.

[5] 侯俊杰. 深入淺出MFC[M]. 武漢:華中科技大學出版社, 1996:339-460.

[6] 廣州天嵌計算機科技有限公司. TQ2440開發板使用手冊,2006.

[7] 王赤. Windows矢量字體字模的提取[J]. 微型機與應用, 2004(8).

[8] 陳曉明. 利用VC++ 實現漢字與位圖點陣數據的提取[J]. 現代電子技術, 2006(9).

[9] 王保華. 利用VC++ 實現漢字字模的提取與小漢字庫的生成[J]. 單片機與嵌入式系統應用, 2002(5).

王小亮,(碩士研究生),研究方向為智能系統與設計;王勇,(副教授),研究方向為集成電路設計。

Withdrawing Lattice of Windows Vector Fonts

Wang Xiaoliang1,Wang Yong1,Tang Yongke1,Qin Lei2

(1.College of Electronics and Information Engineering, Sichuan University, Chengdu 610044,China;2.College of Electrical Engineering and Information, Sichuan University)

Character display is widely used in embedded systems, especially for the embedded systems design without OS, getting lattice of character has played a crucial role in embedded design. Comparing with the general technique to get lattice of vector font through bitmap, this paper introduces a new method that can easily and quickly get lattice of any vector font installed in Windows system by using API of Windows OS. The program interface is simple and beautiful, and the function of the program is powerful and practical.

embedded systems; vector font; lattice; speed; API

TP399

A

2013-12-17)

猜你喜歡
嵌入式
Focal&Naim同框發布1000系列嵌入式揚聲器及全新Uniti Atmos流媒體一體機
TS系列紅外傳感器在嵌入式控制系統中的應用
電子制作(2019年7期)2019-04-25 13:17:14
基于嵌入式Linux內核的自恢復設計
嵌入式系統通信技術的應用
電子制作(2018年18期)2018-11-14 01:48:16
嵌入式PLC的設計與研究
電子制作(2018年16期)2018-09-26 03:27:18
搭建基于Qt的嵌入式開發平臺
基于嵌入式系統Windows CE的應用程序開發
嵌入式單片機在電機控制系統中的應用探討
電子制作(2017年8期)2017-06-05 09:36:15
嵌入式軟PLC在電鍍生產流程控制系統中的應用
電鍍與環保(2016年3期)2017-01-20 08:15:32
Altera加入嵌入式視覺聯盟
主站蜘蛛池模板: 国产毛片基地| 亚洲最大福利网站| 成年午夜精品久久精品| www.精品视频| 97超级碰碰碰碰精品| 国产欧美日韩精品第二区| 日韩天堂视频| 久一在线视频| 久久久久国产一区二区| 国产美女免费| 亚洲国语自产一区第二页| 永久免费精品视频| 亚洲人精品亚洲人成在线| A级毛片无码久久精品免费| 国产成人成人一区二区| 国产成人精品免费av| 国产一级毛片网站| 综合色区亚洲熟妇在线| 91九色国产在线| 91青青视频| 日韩无码视频专区| 国产在线高清一级毛片| 日韩中文精品亚洲第三区| 国产v精品成人免费视频71pao| 亚洲福利视频一区二区| 免费一级α片在线观看| 精品亚洲国产成人AV| 视频二区国产精品职场同事| 亚洲人成影院在线观看| 亚洲人成高清| 99精品在线视频观看| 亚洲美女高潮久久久久久久| 亚洲高清资源| 国产综合另类小说色区色噜噜| 国产91小视频| 日本欧美午夜| 欧美天天干| 欧美午夜久久| 久久精品无码国产一区二区三区 | 永久免费无码成人网站| 成人福利在线免费观看| 成人在线观看一区| 男人天堂伊人网| 91激情视频| 亚洲中文字幕无码爆乳| 2048国产精品原创综合在线| 日本午夜影院| 亚洲av无码久久无遮挡| 亚洲欧美日韩色图| 中文国产成人久久精品小说| 亚洲欧美一区在线| 国产精品一区不卡| 久久99热66这里只有精品一| 精品国产一二三区| 538精品在线观看| 无码 在线 在线| 国产在线观看第二页| 国产丝袜啪啪| 国产无码高清视频不卡| 久久精品视频亚洲| 久久综合色播五月男人的天堂| 亚洲精品视频免费观看| 99热这里只有精品免费| 亚洲一区二区三区香蕉| 亚洲天堂精品视频| 欧美中文一区| 凹凸国产熟女精品视频| 狠狠色综合久久狠狠色综合| 91网站国产| 美女内射视频WWW网站午夜 | 亚洲精品大秀视频| 国产精品分类视频分类一区| 91精品国产情侣高潮露脸| 欧美劲爆第一页| 精品视频在线观看你懂的一区| 九色在线观看视频| 人妻91无码色偷偷色噜噜噜| 在线va视频| 成人免费一级片| 在线观看欧美精品二区| 国产97视频在线观看| 免费网站成人亚洲|