簡體   English   中英

C#繪制字符串像素完美

[英]C# draw a string pixel perfect

我正在嘗試使用textrenderer.drawtext,graphics.drawstring或graphicspath.addstring繪制字符串-主要目的是將所有字體提取到位圖以進行編輯,並將它們用作游戲中的着色器。

使用textrenderer.drawtext和graphics.drawstring,我得到了不同程度的填充-因此我嘗試了graphicspath.addstring。 我提取了字體家族的上升高度和下降高度,但是它們與emheight完全不可用。 (微軟建議您使用上升和下降來實現自己的目標-通過http://msdn.microsoft.com/zh-cn/library/xwf9s90b%28v=vs.110%29.aspx進行操作 。有沒有人成功地使用C#繪制出像素完美的字體?每當我嘗試或查找它時,textrenderer和圖形總是'填充'總是使圖形搞砸,而這種新的graphicspath方法似乎在使用特定比例尺時存在問題。

使用TextRendererMeasureString的常用方法將為您提供SizeF ,其中包含您測量的字符串的邊界。 大多數格式都有些懈怠,因此您可以通過將字符串添加在一起來撰寫文本。

這些方法的目的是通過讓您測量一行何時填充或下一行前進多少像素來幫助創建文本塊。

它們並不是真正用於測量單個字符。

為此,有一個特殊的字符串格式GenericTypographic ,如此處所述它保留了空白。

為了獲得更精確的測量結果,可以在關閉抗鋸齒之后使用GraphicsPath.AddString然后使用GetBounds

現在,如果您想精確地繪制單個字符,比如說以Button為中心,就可以完成任務。

但是您知道所有這些並且您的目標是不同的-如果我理解您的話,您想從每個字符創建位圖,以便以后將它們合並成文本。 這意味着您需要它們垂直正確對齊,即位於同一基線上。

字符的大小對您沒有幫助; 現在,通常您需要每個字符的基線,而您不會得到這些基線,至少不需要像“ f”或什至只是“,”等下降的字符。

但這也無濟於事,因為在GDI中,您始終不會打印/繪制到基線。

您應該執行的操作是,imo要么繪制一個包含所有字符的長字符串,以使它們全部正確對齊,然后一一切出字符。 或者,您可以自己繪制每個字符,但后綴所有您知道具有升序和降序的字符,然后僅從結果中選擇第一列。

因此,我弄清楚該方法的唯一方法是先將字符串繪制到圖形路徑,然后測量圖形路徑中的所有空白點,然后在測量完每個點后才獲取高度,然后重新繪制字符串(我有一個嘗試計數器,可以限制嘗試次數,但可以提高em的像素精度),使用修飾符將舊尺寸和新尺寸考慮在內,然后提取最終尺寸並將其存儲。

只有這樣,我才能繞過每種字體的BS,它具有與之無關的奇怪的頂部填充,它的上升和內部溢出(例如:Ñ)以及下降(以這種方式表示的0,0點)沒有關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM