解決WPF繪制矢量圖形模糊的問題
WPF默認(rèn)提供了抗鋸齒功能,通過向外擴(kuò)展的半透明邊緣來實現(xiàn)模糊化。由于WPF采用了設(shè)備無關(guān)單位,當(dāng)設(shè)備DPI大于系統(tǒng)DPI時,可能會產(chǎn)生像素自動擴(kuò)展問題,這就導(dǎo)致線條自動向外擴(kuò)展一個像素,并且與邊緣相鄰的線條顏色變成了半透明,如下圖所示:

這種特性在繪制細(xì)線條的時候會導(dǎo)致一些我們所不期望的結(jié)果:顏色變淡,線條模糊,線條變粗。很多時候,我們是無法繪制一個像素的清晰的線條的。對于這個問題,WPF給我們提供了幾種解決方案:
1、設(shè)置像素對齊
對于系統(tǒng)內(nèi)置的一些控件,通過設(shè)置SnapsToDevicePixels為true,可以非常方便的實現(xiàn)像素對齊。

這個屬性是有繼承效果的,只要在父控件上設(shè)置了,其所有的子控件都是生效的。但它有時會出現(xiàn)改變窗口大小時線條消失的情況
2、設(shè)置對齊參考線
方法1只針對系統(tǒng)的內(nèi)置的一些控件有效,但對于使用DrawingVisual等方式自繪的圖形則沒有效果。此時可以通過設(shè)置參考線解決這一問題。

簡單的示例如下:
void render(DrawingContext dc)
{
var pen = new Pen(Brushes.Black, 1);
var d = pen.Thickness / 2;
var guidelines = new GuidelineSet(new []v6n4ybs, new[]1s7dcml);
dc.PushGuidelineSet(guidelines);
dc.DrawLine(pen, new Point(30, 10), new Point(30, 80));
dc.DrawLine(pen, new Point(50, 20), new Point(50, 80));
}具體代碼參見MSDN:Apply a GuidelineSet to a Drawing,也可以參看這篇文章WPF DrawingContext seems ignore SnapToDevicePixels
3、設(shè)置 RenderOptions.EdgeMode="Aliased"
前面的設(shè)置參考線方式效果較好,不過需要編寫較多的代碼,并且只能適用于水平或垂直的線條。很多時候,我使用的是設(shè)置 RenderOptions.EdgeMode="Aliased"(如果在代碼中則是使用this.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased))
4、設(shè)置UseLayoutRounding="True"
這個是在WPF4后增加的一個選項,用來控制布局舍入的,用來控制圖片模糊的效果非常好,用于控制控件的模糊效果也不錯的。不過也是對DrawingContext繪制的圖形沒有效果的。
小結(jié):WPF的抗鋸齒效果在給我們帶來的很好的視覺效果的同時,也給我們帶來的不少困擾,本文就總結(jié)了幾種常見的解決方案,希望能對大家的工作帶來一點幫助。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#從windows剪貼板獲取并顯示文本內(nèi)容的方法
這篇文章主要介紹了C#從windows剪貼板獲取并顯示文本內(nèi)容的方法,涉及C#操作剪貼板的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04
C#中面向?qū)ο缶幊虣C(jī)制之多態(tài)學(xué)習(xí)筆記
這篇文章主要介紹了C#中面向?qū)ο缶幊虣C(jī)制之多態(tài)學(xué)習(xí)筆記,本文總結(jié)了個人對多態(tài)的理解以及接口多態(tài)、繼承多態(tài)等內(nèi)容,并給出了代碼示例,需要的朋友可以參考下2015-01-01

