2009-11-15 177 views
11

我正在寫一個小的登錄對話框,並且出於美學原因在對話框的頂部嵌入了一條橫幅。一切進展順利,除了默認情況下,WPF反對別名整個圖像,使其中包含的文本模糊。在WPF圖像上禁用抗鋸齒

經過一番搜索,結果的前幾頁顯示,人們普遍認爲反鋸齒無法在WPF中禁用。任何證實,否則否認這一點?

這對我來說是一個小問題 - 我會將圖像從圖像中取出,然後在背景圖像的頂部疊加一個具有相同文本的標籤,以達到相同的效果(儘管我必須承認,這有點兒討厭)。

感謝, 羅布

+0

另一個爲了避免子pixeling(自動)方式: http://stackoverflow.com/a/16984921/2463642 – MaMazav 2013-06-07 13:28:44

+0

注意,如果在Windows DPI設置已被修改,可能會發生相同問題(使用例如125%或150%的字體大小)。這也會導致位圖被放大,使事情看起來「有趣」(或者更確切地說,醜陋...)。我們可以添加一個單獨的問題,因爲答案/解決方案非常相似。 – 2013-09-17 19:48:16

回答

17

據我所知,縮放位圖時,WPF總是做抗鋸齒。但是,您應該能夠通過避免位圖縮放來實現您的目標。

有兩個步驟:

  1. 在圖像上設置SnapsToDevicePixels="true"
  2. 設置你的圖像上的ScaleTransform縮放它,這樣一個設備像素=一個位圖像素

要計算需要ScaleTransform,像這樣計算你屏幕的DPI:

var DPI = Win32Functions.GetSystemMetrics(SM_CYICON)/SystemParameters.IconHeight * 96; 

,然後爲位圖,這樣做:

var scale = bitmapDPI/DPI; 
var transform = new ScaleTransform(scale, scale); 

這將導致你的位圖的像素正好與設備相匹配的像素。 WPF不會拉伸位圖,所以不應該有抗鋸齒。

如果你想伸高DPI屏幕圖像,但沒有抗鋸齒這樣做(例如,雙所有像素),只是用你最喜歡的算法舒展在自己的代碼位圖,並使用上面的拉伸位圖。

+0

謝謝雷 - 這個評論實際上幫助我今天很多!我使用InteropBitmap作爲圖像的來源,並且它總是被縮放以顯得非常難看(即使位圖DPI是96,這與顯示器DPI不同)。將ScaleTransform添加到「縮小」幫助,現在看起來應該如此。賞金即將到來,但由於SO限制,我必須等待23個小時才能提供給你。 :) – 2013-09-12 21:09:16

+0

賞金給予承諾。 :)我同時也改善了你的答案。 – 2013-09-17 19:32:59