2016-04-01 144 views
0

改寫問題:GDI +字體大小差異

當我從一個單元測試的位圖繪製在Visual Studio中,變焦倍率,我有我的桌面上的考慮,但是當我從控制檯運行它不是。

無論我的桌面設置如何,我可以如何使用Graphics.DrawString呈現文本呈現一致行爲?


我有一個創建一個使用GDI +位圖,並比較他們預先保存的圖像,以確保產生正確的圖像有些NUnit的測試。

我的問題是,當我在Visual Studio中運行測試時,與我在命令行構建腳本中運行然後測試時生成的內容相比,文本(使用Graphics.DrawString呈現)是不同的(使用NUnit 3.2測試亞軍)。

注意:它不是一些小的單像素關閉或文字環繞問題。從控制檯運行時呈現的文本的字體大小較小。

有人知道爲什麼字體大小會根據執行環境在同一臺機器上不同嗎?同樣重要的是:我能做些什麼呢?

+0

你可以顯示相關部分(你從哪裏獲得'Graphics',你如何使用'DrawString'等)? – Sinatr

回答

1

控制檯模式應用程序幾乎從未聲明dpiAware。這一點很重要,當你創建位圖時,無論視頻適配器運行在什麼位置,它們的默認水平/垂直分辨率屬性都是96像素/英寸。 DPI虛擬化功能照顧到這一點。這反過來會影響用於字體的像素數量,因爲默認情況下它們的大小是以點爲單位指定的。一點是1/72英寸,需要繪製多少個像素,例如9個字體的字體取決於每英寸像素比率。它將是9/72 * 96 = 12像素。

在一個運行dpiAware的程序中,例如144 dpi視頻適配器,相同的文本將爲9/72 * 144 = 18像素高。引導你得出結論:控制檯模式應用程序使文本太小。或者,根據您的觀點,dpiAware應用程序會讓它們變得太大。

DPI意識或虛擬化通常很重要,它可以防止程序在高分辨率顯示器上創建無法讀取的文本。在一個4K像素的高分辨率文字看起來像是一團灰塵的顯示器上。這並不完全適用於創建位圖的控制檯模式應用程序。儘管您可能會考慮創建更大的位圖,因此也會使用更大的文本。因爲如果你不這些小的位圖,當他們必須重新調整以匹配4K顯示器時,看起來不太好。尤其值得注意的是,抗鋸齒像素變成了不再抗鋸齒的巨石。

如果不是,並且您只關心像素大小,則應考慮避免此問題,即使用一個需要GraphicsUnit的Font構造函數。你會喜歡GraphicsUnit.Pixel而不是默認的。無論視頻適配器設置如何,您將獲得可預測的文本高度(像素爲),這是整個位圖高度的固定比例。

+0

我在發佈我的問題後告訴我的問題; Hans Passant將在幾分鐘內向我們解釋這一點 - 而你做到了! :-) #英雄 –