用GetGlyphOutline搞字模

來源:互聯網
上載者:User

http://blog.csdn.net/yusjoel/article/details/5721043

 

GetGlyphOutline 

製作字模是漢化的一個基本能力吧,不過有很多好用的軟體,比如Crystal Tile2,以至於我一直沒高興去研究。

  搞字模大約這麼兩條路,一個是TextOut出來,然後一個點一個點讀取。另一個就是調用GetGlyphOutline。

  我這次是使用GetGlyphOutline這個函數,原型如下:

DWORD GetGlyphOutline(

    HDC hdc,   // handle of device context

    UINT uChar,   // character to query

    UINT uFormat, // format of data to return

LPGLYPHMETRICS lpgm, // address of structure for metrics

    DWORD cbBuffer,   // size of buffer for data

    LPVOID lpvBuffer, // address of buffer for data

    CONST MAT2 *lpmat2   // address of transformation matrix structure 

   );

    裡面重要一點的參數是uForamt,有GGO_BITMAP、GGO_GRAY2_BITMAP、GGO_GRAY4_BITMAP和GGO_GRAY8_BITMAP    等等選項可供選擇。

    裡面主要的就是灰階點陣,就是後面3個選項,因為純點陣的話,用Crystal Tile2就搞定了,也不用麻煩。不過我實際使用下來灰階的效果也一般,聊勝於無了。

    還有一點討厭的是n位色是n^2+1級顏色,比如4位色,GGO_GRAY4_BITMAP,搞出來的灰階是17級,從0到10000B,一般遊戲的字模4位色的肯定16級的吧。

    然後就是lpgm,這個是本文的重點。等下說明。

    最後就是lpmat2,用來做矩陣變換用的,可以展開、傾斜,學過電腦繪圖總有點概念的。平時沒事設定成單位矩陣就是了。

  下面講GLYPHMETRICS,先看下它的聲明:

typedef struct _GLYPHMETRICS { // glmt 

    UINT  gmBlackBoxX; 

    UINT  gmBlackBoxY;

    POINT gmptGlyphOrigin;

    short gmCellIncX;

    short gmCellIncY;

} GLYPHMETRICS;

關於這玩意兒的介紹很少,我網上好不容易找到一張圖(忘記從哪裡搞來的了,無法標明連結,罪過罪過),可以明白的說明這些參數:

首先,外面那個大框就是Cell,gmCellIncX和gmCellIncY就是這個框的寬和高。

然後一個字真正佔據的部分叫做Black box,顯然“國”的Black box要比“一”來的大。同樣gmBlackBoxX和gmBlackBoxY就是Black box的寬和高。

gmptGlyphOrigin就是Black box的左上的頂點,但是要注意的是這個gmptGlyphOrigin的座標並不是以Cell的左下角頂點為軸心的。

而是以base line和左邊線的焦點為軸心。注意base line這個概念被不存在於漢字中,這是拉丁文的概念,相當於英文練習本中四線中的第三條線。可以看下右邊的兩個英文字母。

至於base line多少大,圖中標明是tmDescent,這是TEXTMETRIC結構的成員。我反正要擷取16左右的字模,base line總是2

假如說你要提取字模的時候,要求四邊都不留空。那麼就應該提取

(gmptGlyphOrigin.x, gmptGlyphOrigin.y + tmDescent) – (gmptGlyphOrigin.x + gmBlackBoxX, gmptGlyphOrigin.y + tmDescent – gmBlackBoxY)

這部分內容。

上述座標是以cell的左下角為軸心的,其實並不符合大家left, top的習慣,而且處理lpvBuffer的時候也不對。

轉成左上方為軸心的話,座標如下:

(gmptGlyphOrigin.x, gmCellIncY - gmptGlyphOrigin.y - tmDescent) – (gmptGlyphOrigin.x + gmBlackBoxX, gmCellIncY - gmptGlyphOrigin.y - tmDescent + gmBlackBoxY)

描邊

有時候字模需要描邊,我網上搜了很久,確認並沒有什麼函數可以方便地搞定描邊這件事情。也許有描邊函數存在於某個超級大的3D開發包中,沒有興趣去裝。

可以用個簡單的演算法完成描邊,就是將字模上下左右移動1位,如果是灰階字模的話,只要有顏色就改成黑色。最後再用原始的字模原位寫一遍。得到的結果基本可以接受。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.