解決WPF繪制矢量圖形模糊的問(wèn)題
WPF默認(rèn)提供了抗鋸齒功能,通過(guò)向外擴(kuò)展的半透明邊緣來(lái)實(shí)現(xiàn)模糊化。由于WPF采用了設(shè)備無(wú)關(guān)單位,當(dāng)設(shè)備DPI大于系統(tǒng)DPI時(shí),可能會(huì)產(chǎn)生像素自動(dòng)擴(kuò)展問(wèn)題,這就導(dǎo)致線條自動(dòng)向外擴(kuò)展一個(gè)像素,并且與邊緣相鄰的線條顏色變成了半透明,如下圖所示:
這種特性在繪制細(xì)線條的時(shí)候會(huì)導(dǎo)致一些我們所不期望的結(jié)果:顏色變淡,線條模糊,線條變粗。很多時(shí)候,我們是無(wú)法繪制一個(gè)像素的清晰的線條的。對(duì)于這個(gè)問(wèn)題,WPF給我們提供了幾種解決方案:
1、設(shè)置像素對(duì)齊
對(duì)于系統(tǒng)內(nèi)置的一些控件,通過(guò)設(shè)置SnapsToDevicePixels為true,可以非常方便的實(shí)現(xiàn)像素對(duì)齊。
這個(gè)屬性是有繼承效果的,只要在父控件上設(shè)置了,其所有的子控件都是生效的。但它有時(shí)會(huì)出現(xiàn)改變窗口大小時(shí)線條消失的情況
2、設(shè)置對(duì)齊參考線
方法1只針對(duì)系統(tǒng)的內(nèi)置的一些控件有效,但對(duì)于使用DrawingVisual等方式自繪的圖形則沒(méi)有效果。此時(shí)可以通過(guò)設(shè)置參考線解決這一問(wèn)題。
簡(jiǎn)單的示例如下:
void render(DrawingContext dc) { var pen = new Pen(Brushes.Black, 1); var d = pen.Thickness / 2; var guidelines = new GuidelineSet(new []ublnpf9mb, new[]ublnpf9mb); 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)); }
具體代碼參見(jiàn)MSDN:Apply a GuidelineSet to a Drawing,也可以參看這篇文章WPF DrawingContext seems ignore SnapToDevicePixels
3、設(shè)置 RenderOptions.EdgeMode="Aliased"
前面的設(shè)置參考線方式效果較好,不過(guò)需要編寫較多的代碼,并且只能適用于水平或垂直的線條。很多時(shí)候,我使用的是設(shè)置 RenderOptions.EdgeMode="Aliased"
(如果在代碼中則是使用this.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased)
)
4、設(shè)置UseLayoutRounding="True"
這個(gè)是在WPF4后增加的一個(gè)選項(xiàng),用來(lái)控制布局舍入的,用來(lái)控制圖片模糊的效果非常好,用于控制控件的模糊效果也不錯(cuò)的。不過(guò)也是對(duì)DrawingContext繪制的圖形沒(méi)有效果的。
小結(jié):WPF的抗鋸齒效果在給我們帶來(lái)的很好的視覺(jué)效果的同時(shí),也給我們帶來(lái)的不少困擾,本文就總結(jié)了幾種常見(jiàn)的解決方案,希望能對(duì)大家的工作帶來(lái)一點(diǎn)幫助。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解析C#彩色圖像灰度化算法的實(shí)現(xiàn)代碼詳解
本篇文章是對(duì)C#中彩色圖像灰度化算法的實(shí)現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C# out關(guān)鍵詞的應(yīng)用實(shí)例
下面小編就為大家分享一篇C# out關(guān)鍵詞的應(yīng)用實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12C#將圖片存放到SQL SERVER數(shù)據(jù)庫(kù)中的方法
這篇文章主要介紹了C#將圖片存放到SQL SERVER數(shù)據(jù)庫(kù)中的方法,以實(shí)例形式較為詳細(xì)的分析了C#保存圖片到SQL Server數(shù)據(jù)庫(kù)的具體步驟與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09解決C#獲取鼠標(biāo)相對(duì)當(dāng)前窗口坐標(biāo)的實(shí)現(xiàn)方法
本篇文章是對(duì)在C#中獲取鼠標(biāo)相對(duì)當(dāng)前窗口坐標(biāo)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05如何使用C#修改本地Windows系統(tǒng)時(shí)間
這篇文章主要介紹了如何使用C#修改本地Windows系統(tǒng)時(shí)間,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-01-01C# Winfrom實(shí)現(xiàn)Skyline畫直線功能的示例代碼
這篇文章主要介紹了C# Winfrom實(shí)現(xiàn)Skyline畫直線功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12