[size=medium][color=blue]??? 字體的鏡像一直是軟件沒有解決的一個問題,被困擾了幾年都沒人去研究解決。記得剛來公司的時候,也調查過這個任務,也找到一個很有價值的實例。當時找到萬一老師的delphi博客,上面有一篇文章《區域變換》
http://www.cnblogs.com/del/archive/2008/06/03/1212534.html
其中有:
?? 這幾部分的明顯實現了對字體鏡像的功能,由于當時只是看到功能,對這些東西的意義不是很透徹,所以這樣的建議被淘汰了,原因(最大的原因沒人明白其中的意義
)“好像是對一片區域的拷貝,這樣會有問題”。總覺得看著例子很正常啊!怎么會是有問題呢?后來在自己的調查中逐漸也了解了關于path,region的意義。path,region在gdi中也是兩種圖形,通過他們可以用簡單的方式畫出更加多樣的圖像。因為生成光繪的時候如果遇到中文字體的話,就沒辦法自己造字了,因為中文字有很多很多,所以這也是一個一直沒有解決的問題。
??? 后來在研究path圖形的時候,用到以下代碼可以取到字體的邊緣點數據。
??? 這樣的話鏡像也可以很容易實現了:
定義:
??? 但是這樣畫出來的自己怎么看上去都沒有textout出來的那么清晰,但是也只能這樣了,好像有個GetGlyphOutline聽說得到的點數據會更精確一些,不過沒有確認,這個有些復雜。
??? 另外的方面就是directx 和 opengl 的實現方法,由于對這兩種技術一直沒有機會接觸,所以也就沒有發言權了。
[/color][/size] {建立路徑} BeginPath(cvs.Handle); cvs.TextOut(100, 0, 'F'); EndPath(cvs.Handle); {將路徑轉換為區域} Rgn := PathToRegion(cvs.Handle); ...... 7: begin {水平鏡像} TXF.eM11 := -1; TXF.eM12 := 0; TXF.eM21 := 0; TXF.eM22 := 1; TXF.eDx := 200; {需要右移一些才能看到} TXF.eDy := 0; ... {執行變換并重繪} Rgn := ExtCreateRegion(@TXF, RgnDataSize, RgnData^);
?? 這幾部分的明顯實現了對字體鏡像的功能,由于當時只是看到功能,對這些東西的意義不是很透徹,所以這樣的建議被淘汰了,原因(最大的原因沒人明白其中的意義

??? 后來在研究path圖形的時候,用到以下代碼可以取到字體的邊緣點數據。
BeginPath(PDC); TextOut(PDC, x, y, PChar(TextStr), Length(TextStr)); EndPath(PDC);
??? 這樣的話鏡像也可以很容易實現了:
BeginPath(PDC); TextOut(PDC, x, y, PChar(TextStr), Length(TextStr)); EndPath(PDC); count := GetPath(PDC, pts^, types^, 0); GetMem(pts, count * SizeOf(TPoint)); GetMem(types, count); count := GetPath(PDC, pts^, types^, count);
定義:
pts: ^TPArr; types: ^TTArr; count: Integer; type TPArr = array[0..0] of TPoint; TTArr = array[0..0] of Byte;
??? 但是這樣畫出來的自己怎么看上去都沒有textout出來的那么清晰,但是也只能這樣了,好像有個GetGlyphOutline聽說得到的點數據會更精確一些,不過沒有確認,這個有些復雜。
??? 另外的方面就是directx 和 opengl 的實現方法,由于對這兩種技術一直沒有機會接觸,所以也就沒有發言權了。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
