2016-02-25 73 views
3

我使用WinForms創建一個96xpi分辨率的512x512像素圖像。初始化後,我使用OnPaint使用Graphics.DrawImage來繪製此圖像。我在運行該程序時得到的圖像如下所示:基本上是一張包含某些與我想要顯示的內容相似的圖像的1024x1024圖像,除了它由2x2像素塊組成,所有圖像均具有相同的顏色。這很奇怪。爲什麼WinForms繪製我的圖像大小的4倍?

有人能幫我弄清楚發生了什麼事嗎?這隻發生在高DPI顯示器上,該程序在普通的顯示器上工作得很好。

enter image description here

更新1:我明確設置過程中要DPI,不知道有SetProcessDpiAwareness(_Process_DPI_Awareness.Process_DPI_Unaware);並明確在一個矩形調用DrawImage,即

e.Graphics.DrawImage(bmp, 
     new Rectangle(0, 0, 512, 512), 
     new Rectangle(0, 0, 512, 512), GraphicsUnit.Pixel); 

,並沒有幫助。

編輯2:上打開DPI意識之後,我現在得到相同的垃圾,但在合適的尺寸:

enter image description here

編輯3:終於得到了它,文物是我在CUDA方面錯誤地渲染東西的結果。高DPI的廢話只是一個分心。

+2

添加您用於繪製圖像的代碼。 – CathalMF

回答

4

這僅發生在高DPI顯示

也就是說完全正常的,你所看到的圖像得到重新調整,以匹配顯示器的DPI。這使得它更大,所以以英寸爲單位的尺寸是相同的。

完成這項工作的原始方法是當您依賴DPI虛擬化時。 Windows可以讓你的程序像在96 DPI監視器上一樣工作,但可以將它繪製成位圖。並重新調整該位圖以將其顯示在屏幕上。非常粗糙,但你的程序仍然可用,文本質量非常明顯。

不粗魯的方法是當你宣佈你的程序是dpiAware。現在Windows不再有幫助,它是負責這項工作的Graphics.DrawImage()。它本身重新縮放圖像以使圖像DPI與顯示器DPI相匹配。文字看起來很脆。這張照片,呃,你必須把椅子放回去。

如果您不想重新縮放,則必須使用Graphics.DrawImage()重載,該重載需要使用Rectangle參數。但請記住,圖像變成這樣一個不錯的顯示器上的郵票。您必須將您的椅子移近:)

+0

遵循您的建議,並沒有幫助 - 在明確禁用DPI感知並將圖像設置爲在特定矩形內呈現後的相同行爲。 –

+1

禁用dpi意識然後編寫該代碼是沒有意義的。奇怪這是這樣的火箭科學。聽起來像是它可能從未在第一個地方。 –

+0

對,所以我開啓了DPI認識*,現在我得到了同樣奇怪的垃圾圖像,但我以正常尺寸獲得了它。讓我更新截圖... –

相關問題