WPF Blurry फोंट मुद्दा- समाधान


153

समस्या का वर्णन और निम्न लिंक पर प्रदर्शित किया जाता है:

स्पष्टीकरण: WPF में पाठ स्पष्टता । इस लिंक में फ़ॉन्ट तुलना है।

मैं इस समस्या के लिए सभी संभव समाधान एकत्र करना चाहूंगा। Microsoft अभिव्यक्ति ब्लेंड WPF का उपयोग करता है, लेकिन फोंट पठनीय दिखते हैं।

  • Microsoft अभिव्यक्ति मिश्रण के रूप में डार्क बैकग्राउंड
  • फ़ॉन्ट का आकार बढ़ाना और फ़ॉन्ट बदलना (कालीबरी ...) [लिंक]
  • एंबेड विंडो फॉर्म [लिंक]
  • एक बिटमैप को पाठ रेंडर करने के लिए GDI + और / या विंडोज फॉर्म टेक्स्टरेंडर वर्ग का उपयोग करें, और फिर उस बिटमैप को WPF नियंत्रण के रूप में प्रस्तुत करें। [संपर्क]

क्या कोई और उपाय हैं?

यह VS2010 (और WPF4) बीटा 2 में तय होने जा रहा है

यह प्यार करता है यह अंतिम हल किया गया है!

स्कॉट हैनेलमैन का ComputerZen.com: WPF और पाठ धुंधलापन, अब पूरी स्पष्टता के साथ


VS2010RC मेरे लिए पूरी तरह से व्यर्थ है mpdreamz.nl/vs2010RC-blur.png
मार्टिन Laarman

मेरी मशीन पर VS2010RC आपकी तस्वीर पर बहुत बेहतर लग रही है, वास्तव में सफेद पृष्ठभूमि के साथ बहुत अच्छा है, लेकिन अभी भी अंधेरे पृष्ठभूमि के साथ बेकार है।
रॉबर्ट वुकोविक

क्या आपको इस मुद्दे का कोई हल मिला, वास्तव में मेरे आवेदन में यहाँ भी यही मुद्दा है और मैं
vs2010 के

अंतिम 3 लिंक मृत हैं।
शाइन जाएगुक

जवाबों:


107

तकनीकी पृष्ठभूमि

WPF टेक्स्ट प्रोग्राम मैनेजर्स में से एक पर windowsclient.net: Text Clarity in WPF से WPF Text रेंडरिंग के बारे में गहन लेख है ।

WPF के लिए समस्या यह है कि चिकनी एनिमेशन के लिए एक रेखीय स्केलिंग फ़ॉन्ट-रेंडरर की आवश्यकता है। दूसरी ओर प्योर क्लियर टाइप अगले पिक्सेल में ऊर्ध्वाधर उपजी को पुश करने के लिए फ़ॉन्ट के साथ काफी स्वतंत्रता लेता है।

अंतर स्पष्ट है अगर कोई क्लासिक "कैस्केड" पैटर्न की तुलना करता है। WinForms निचले बाईं ओर, शीर्ष दाईं ओर WPF:

हालांकि मैं WPF के फ़ॉन्ट रेंडरिंग आइडियोसिंक्रैसीज़ का कोई प्रशंसक नहीं हूं, लेकिन मैं इस बात की कल्पना कर सकता हूं कि अगर एनिमेशन विमेंस कैस्केड में करते हैं तो एनिमेशन कूद जाएंगे।

रजिस्ट्री के साथ खेल रहा है

मेरे लिए विशेष रुचि MSDN लेख " ClearType रजिस्ट्री सेटिंग्स " का लिंक था , जो रजिस्ट्री में संभावित उपयोगकर्ता-साइड समायोजन की व्याख्या करता है:

  • क्लियरटाइप स्तर: सबपिक्सल हिंटिंग की मात्रा
  • गामा स्तर
  • पिक्सेल संरचना: डिस्प्ले-पिक्सेल में रंग की धारियों को कैसे व्यवस्थित किया जाता है
  • पाठ विपरीत स्तर: फ़ॉन्ट को भारी बनाने के लिए ग्लिफ़ तनों की चौड़ाई को समायोजित करता है

इन सेटिंग्स के साथ खेलने से वास्तव में अंतर्निहित समस्या में सुधार नहीं हुआ है, लेकिन संवेदनशील उपयोगकर्ताओं के लिए रंग रक्तस्राव प्रभाव को कम करके मदद कर सकता है।

एक और दृष्टिकोण

टेक्स्ट क्लेरिटी लेख द्वारा दी गई सबसे अच्छी सलाह फ़ॉन्ट का आकार बढ़ाना और फ़ॉन्ट बदलना थी। Calibri मेरे लिए मानक Segoe UI से बेहतर काम करता है। वेब फ़ॉन्ट के रूप में इसकी लोकप्रियता के कारण, मैंने वरदाना की भी कोशिश की, लेकिन इसमें 14pt और 15pt के बीच वजन में एक बुरा उछाल है जो फ़ॉन्ट आकार को एनिमेट करते समय बहुत दिखाई देता है।

WPF 4.0

WPF 4 ने फोंट के प्रतिपादन को प्रभावित करने के लिए समर्थन में सुधार किया होगा। नहीं है WPF पाठ ब्लॉग पर एक लेख परिवर्तन समझा। सबसे प्रमुख रूप से, अब (कम से कम) तीन अलग-अलग प्रकार के टेक्स्ट रेंडरिंग हैं:

पाठ प्रतिपादन तुलना

<grumble> कि हर डिजाइनर के लिए पर्याप्त रस्सी होनी चाहिए। </ grumble>


11
उत्कृष्ट व्याख्या, +1। संभवत: बताते हैं कि फ्लैश में इतना भयावह फ़ॉन्ट क्यों है।
जेफ एटवुड

1
हाँ। यह एक अच्छी व्याख्या है, लेकिन मैं अभी भी चाहता हूं कि फ़ॉन्ट को चालू करने का एक अच्छा तरीका हो जब आप जानते हैं कि आप चेतन नहीं जा रहे हैं। मुझे लगता है कि यह एक दिया हुआ पैमाना होगा जिसके लिए आप इशारा कर रहे हैं। इस तरह का सामान WPF मुझे अभी भी बीटा-वर्जन लगता है।
पीटरअलेनवेब

यह "स्केलेबल" वैरिएंट की तरह नहीं है, फॉन्ट हिंटिंग का उपयोग नहीं करता है, यह सिर्फ इतना है कि WPF पिक्सेल ग्रिड से टकराने के लिए ऑप्टिमाइज़ नहीं करता है, जैसे क्लियर टाइप करता है। संभवतः SnapToDevicePixels को पाठ के लिए काम करना चाहिए, लेकिन इसे हमेशा विरासत में प्राप्त करना होगा क्योंकि एक नियंत्रण यह नहीं जान सकता है कि यह स्नैप हो सकता है या नहीं।
डेविड श्मिट

2
विशेष रूप से प्रासंगिक है TextOptions.TextFormattingMode संलग्न संपत्ति ( msdn.microsoft.com/en-us/library/ee169597.aspx )। WPF4 और सिल्वरलाइट में UseLayoutRounding ( msdn.microsoft.com/en-us/library/dd783605.aspx ) और SnapsToDevicePixels ( msdn.microsoft.com/en-us/library/… ) गुण भी हैं।
पैट

@ सभी: मुझे WPF3.5 में पाठ के एंटी-अलियासिंग को निष्क्रिय करने का एक तरीका नहीं मिल सकता है और परिणामस्वरूप लेबल या बटन पाठ वास्तव में खराब दिखता है। आदर्श रूप से मैं फोंट के लिए विश्व स्तर पर एंटी अलियासिंग को निष्क्रिय करना चाहूंगा। मैं यह कैसे हासिल कर सकता हूं?
SharpUrBrain

128

.NET 4 में अंत में WPF की खराब टेक्स्ट रेंडरिंग क्वालिटी का समाधान है, लेकिन यह अच्छी तरह से छिपा हुआ है। प्रत्येक विंडो के लिए निम्नलिखित सेट करें:

TextOptions.TextFormattingMode="Display"

डिफ़ॉल्ट मान "आदर्श" है जो नाम का तात्पर्य बिल्कुल नहीं है।

TextOptions में दो अन्य विकल्प हैं, अर्थात् TextHintingMode और TextRenderingMode, लेकिन वे दोनों समझदार चूक हैं।


सब। धन्यवाद। यह समस्या को हल करने में मेरी मदद करता है, लेकिन आपको केवल यह परिभाषित करने की आवश्यकता है कि कंटेनर में एक बार <ग्रिड>
पीटर ड्यू

हां, और यदि आप इसे किसी विंडो पर सेट करते हैं तो यह उस विंडो के भीतर मौजूद हर चीज के लिए मान्य है।
हेलिज क्लेन

इसके लिए बहुत सारे समय की तलाश में हैं, साइटों और ब्लॉगों के टन पर, जो कि पाठ प्रारूपण VS2010 RTM / .net 4 में कितना बेहतर है, इस बारे में और आगे बढ़ते हैं (मैं मानता हूं, यह है!)। लेकिन उनमें से किसी ने भी यह उल्लेख करने की परवाह नहीं की कि आप इसके साथ आपके द्वारा बनाए गए WPF-Applications कैसे बना सकते हैं, यह भी अच्छा है। वह संपत्ति इतनी अच्छी तरह से छिपी क्यों है? आपका बहुत बहुत धन्यवाद।
एम-पेरोर

5
मैं बस यही चाहता हूँ! मुझे वास्तव में परवाह नहीं है कि WPF रेंडरिंग कितनी परिष्कृत है, फोंट किसी के लिए भी अस्वीकार्य हैं।
जेरी लियांग

1
"प्रदर्शन" के बजाय "आदर्श" मेरे लिए काम करता है। प्रोजेक्ट .NET 4.6.2 पर है। शायद उन्होंने भ्रमित नाम तय कर दिया।
जो

40

मुझे दूसरे दिन एक समस्या का सामना करना पड़ा जब मैंने एक सीमा का उपयोग किया, जिसमें ड्रॉपशेडोफेक्ट लागू था। इसका नतीजा यह हुआ कि उस सीमा के अंदर का सारा पाठ बेहद धुंधला था। इससे कोई फर्क नहीं पड़ता कि पाठ अन्य पैनलों के अंदर या सीधे सीमा के अंदर था - कोई भी टेक्स्ट ब्लॉक जो माता-पिता का बच्चा है, जिसका प्रभाव लागू होता है, वह प्रभावित होने लगता है।

इस विशेष मामले का हल सीमा के अंदर सामान नहीं रखना है, जिसमें प्रभाव हो, बल्कि एक ग्रिड (या कुछ और जो एक दूसरे के ऊपर सामग्री डालने का समर्थन करता है) का उपयोग करें और पाठ के रूप में एक ही सेल में एक आयत रखें (यानी दृश्य पेड़ में एक भाई के रूप में) और उस पर प्रभाव डालते हैं।

इस तरह:

<!-- don't do this --->
<Border>
     <Border.Effect>
          <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/>
     </Border.Effect>
     <TextBlock Text="This Text Will Be Blurry" />
</Border>

<!-- Do this instead -->
<Grid>
  <Rectangle>
     <Rectangle.Effect>
          <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/>
     </Rectangle.Effect>
  </Rectangle>
  <TextBlock Text="This Text Will Be Crisp and Clear" />
</Grid>

यह चाल अच्छी तरह से किया। एक हैक के बिट, लेकिन सेटिंग्स आदि के साथ खिलवाड़ करने से बेहतर है। धन्यवाद। हालाँकि मुझे एक बात जो करनी थी, वह थी आयत का भरा हुआ भाग। हालांकि यह सिर्फ मेरा सेटअप था।
हेड्स

हाँ, आप सही हैं .. आयत डिफ़ॉल्ट रूप से पारदर्शी है जो ड्रॉप शैडो को अजीब लगता है।
इसक सावो

यह मेरे नमूना अनुप्रयोग में नहीं हो रहा है, मैं WPF 3.5
SharpUrBrain

@SharpUrBrain: क्या नहीं हो रहा है? क्या यह मेरे दूसरे उदाहरण का उपयोग करने के बाद भी धुंधली है?
इसक सावो

हां, यह आपके दूसरे उदाहरण का उपयोग करने के बाद भी धुंधला है
SharpUrBrain


6

SnapToDevicePixels केवल WPF आकृतियों (लाइनों आदि) पर लागू होता है, पाठ रेंडरर के लिए नहीं।

इस समस्या का कोई ज्ञात समाधान नहीं है। Microsoft के अनुसार, व्यवहार "डिज़ाइन द्वारा" है।

Microsoft फ़ोरम पर इस थ्रेड को समस्याओं पर चर्चा करते हुए भी देखें - इसने एमएस लोगों के कुछ जवाब दिए हैं जो इस मुद्दे पर उनकी स्थिति को स्पष्ट करते हैं।


WPO 4 में TextOptions.TextFormattingMode संलग्न संपत्ति ( msdn.microsoft.com/en-us/library/ee169597.aspx ) का उपयोग करके फिक्स्ड ।
पैट

1
संपत्ति का नाम "SnapsToDevicePixels" है न कि "SnapToDevicePixels"।
नीर कोर्नफेल्ड

6

एक डेवलपर के बिंदु से, तिथि करने के लिए एकमात्र ज्ञात "वर्कअराउंड" है GDI + और / या विंडोज फॉर्म टेक्स्टरेंडर वर्ग का उपयोग करके एक बिटमैप को पाठ रेंडर करना, और फिर उस बिटमैप को WPF नियंत्रण के रूप में प्रस्तुत करना। स्पष्ट प्रदर्शन निहितार्थ के अलावा, यह मौजूदा अनुप्रयोगों के लिए समस्या को कम नहीं करता है।

मैंने अब इस मुद्दे के लिए Microsoft कनेक्ट टिकट बनाया है (मेरे आश्चर्य के लिए, सभी नकारात्मकता के बावजूद, निर्दिष्ट ट्रैकर में कोई वास्तविक बग रिपोर्ट नहीं थी)।

चूँकि यह Microsoft के अनुरोधों और प्रश्नों को संप्रेषित करने के आधिकारिक चैनलों में से एक है, इसलिए मैं इसके त्वरित उत्तर के लिए भी सलाह दूंगा। कम से कम, यदि आप इस मुद्दे को एक तरह से या किसी अन्य तरीके से संबोधित करना चाहते हैं, तो उस टिकट के लिए वहां मतदान करना और / या इस समस्या को मान्य करने से Microsoft पीएम और इंजीनियरों का ध्यान इस समस्या की ओर आकर्षित करने में मदद मिलेगी, और संभवतः इसकी कथित प्राथमिकता बढ़ेगी।


6

मैं इसे बग के रूप में नहीं देखता, लेकिन डिफ़ॉल्ट कॉन्फ़िगरेशन वास्तव में बहुत कष्टप्रद है। यहाँ के सभी संयोजनों की तुलना है

TextOptions.TextRenderingMode
TextOptions.TextFormattingMode
RenderOptions.ClearTypeHint

SnapToDevicePixels पाठ रेंडरिंग में कोई अंतर नहीं करता है।

http://i.stack.imgur.com/cS3S2.png

मैं पसंद करता हूं:

TextOptions.TextRenderingMode="Auto"
TextOptions.TextFormattingMode="Ideal"
RenderOptions.ClearTypeHint="Auto"

जहाँ ऊर्ध्वाधर रेखाएँ कभी धुंधली नहीं होती हैं।

उपयोग किया जाने वाला फ़ॉन्ट ओपन सैंस लाइट है, जो वास्तव में सुशोभित हो सकता है यदि इसका उपयोग अच्छी तरह से किया जाए, जैसे नवीनतम टीमव्यूअर में।

Mahapps.Metro का उपयोग करने वालों के लिए, समस्या TransitioningContentControl https://github.com/MahApps/MahApps.Metro/issues/889 है


4

बस VS2010 बीटा की कोशिश की, जो कि WPF में किया जाता है, और यह BADLY को धुंधली-फ़ॉन्ट समस्या से ग्रस्त करता है। विशेष रूप से टूलटिप्स पर।

ऐसा लगता है कि WPF4 वास्तव में समस्या को हल नहीं करेगा (अगर कुछ भी बदतर लग रहा है)


3
मैं पाठ को धुंधला करने वाली UI में प्रत्येक स्थान के लिए VS2010B1 के खिलाफ बग दर्ज कर रहा हूं। टूलटिप्स लगभग खराब हैं, मैं सहमत हूं। यह देखते हुए कि स्पष्ट रूप से यह कहा गया है कि यह WPF4 में तय किया जाना था, मैं केवल यह आशा कर सकता हूं कि यह इस बीटा के लिए कटौती नहीं कर पाए।
विल डीन

4

वाह, मैं विश्वास नहीं कर सकता मैं अंत में मेरे WPF फोंट पठनीय है। और मैं यह भी नहीं मान सकता कि इन परिवर्तनों को आसान बनाने के लिए कोई विकल्प संवाद नहीं है जबकि मेरे प्रदर्शन पर डिफ़ॉल्ट मान भयानक हैं।

इन रजिस्ट्री सेटिंग्स (दशमलव में) ने मेरे लिए काम किया और मेरे नियमित क्लीयर टाइप फ़ॉन्ट के करीब आ गई:

  • ClearTypeLevel: 10 (ज्यादातर ग्रीसेस्क एलियासिंग)
  • गामावेल: 1300 (उच्च गामा ने फ़ॉन्ट को बहुत पतला बना दिया और मैं अलियासिंग में रंग देख रहा था)

3

वे कहते हैं "SnapToDevicePixels = true" काम करता है, लेकिन मैंने कभी कोई अच्छा परिणाम नहीं देखा।

मैं एक अलग फ़ॉन्ट पर स्विच करके धुंधले पाठ का मुकाबला करता हूं।

जाहिर है कि यह समस्या का समाधान नहीं है, हालांकि यह है कि मैंने इसके चारों ओर कैसे काम किया है।


मैं सिर्फ एक बिना SnapToDevicePixels = "सच" के साथ एक TextBlock की तुलना करता हूं और 12duis में Segoe UI फ़ॉन्ट के साथ कोई अंतर नहीं था । क्या मैं पूछ सकता हूं कि आप किन फोंट का उपयोग करते हैं?
डेविड श्मिट

हमने अपने फॉन्ट को बदलकर भी स्थिति को बेहतर बनाया। हमारे द्वारा चुना गया फ़ॉन्ट Avenir था (मुझे नहीं लगता कि यह डिफ़ॉल्ट रूप से स्थापित है, कम से कम विंडोज एक्सपी पर नहीं)।
cplotts

0

यदि आप अपने ऐप के लिए विंडोज़ को अनुकूलित करने के लिए C # बेस क्लास का उपयोग करना पसंद करते हैं (या अब इसका कारण है), तो यहां बताया गया है कि आप आकर्षक प्रदर्शन मोड का उपयोग करने के लिए टेक्स्ट फ़ॉर्मेटिंग को कैसे सेट कर सकते हैं:

public class SnappyWindow : Window
{
    public SnappyWindow()
    {
        SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.