मेरी छवियां धुंधली हैं! WPF के SnapsToDevicePixels क्यों काम नहीं कर रहा है?


165

मैं अपने WPF प्रशंसा में कुछ छवियों का उपयोग कर रहा हूँ।

XAML:

<Image Name="ImageOrderedList"
       Source="images/OrderedList.png"
       ToolTip="Ordered List"
       Margin="0,0,5,5"
       Width="20"
       Height="20"
       SnapsToDevicePixels="True"
       MouseUp="Image_MouseUp"
       MouseEnter="Image_MouseEnter"
       MouseLeave="Image_MouseLeave" />

लेकिन, वे फजी दिखाई देते हैं।

वह SnapsToDevicePixels="True"रेखा इस समस्या को रोकती क्यों नहीं है ?



4
आपकी छवि लिंक टूट गई है। यदि आपके पास अभी भी मूल चित्र हैं, तो कृपया उन्हें stack.imgur पर पुनः लोड करें। धन्यवाद।
इल्मरी करोनन

1
यदि नीचे दिए गए सुझावों में से कोई भी तुरंत काम नहीं करता है, तो भी अपनी छवि के आकार को चौड़ाई और ऊंचाई में 4 के कारक में बदलने का प्रयास करें और बदलें। इसलिए 179 एक्स 44 के बजाय, 176 एक्स 44 की कोशिश करें।
मार्टिन लॉटरी

जवाबों:


233

आप WPF4 में अब उपलब्ध एक नई संपत्ति की कोशिश करने पर विचार कर सकते हैं । HighQualityRenderOptions.BitmapScalingMode को छोड़ दें या बस इसे घोषित न करें।

नियरेस्टाइनबोरबर ने मेरे लिए काम किया, सिवाय इसके कि जब आवेदन पर जूमिंग हुई तो झटकेदार बिटमैप्स का नेतृत्व किया। यह भी किसी भी glitches को ठीक करने के लिए प्रतीत नहीं हुआ, जहां माउस अजीब तरीके से आकार दे रहे थे।

अपने मूल तत्व पर (अर्थात आपकी मुख्य विंडो) यह गुण जोड़ें: UseLayoutRounding="True" :।

पहले केवल सिल्वरलाइट में उपलब्ध एक प्रॉपर्टी ने अब सभी बिटमैप साइज़िंग वाइप्स को ठीक कर दिया है। :)


4
: इस नए संपत्ति पर अधिक जानकारी यहाँ मिल blogs.msdn.com/text/archive/2009/08/27/layout-rounding.aspx
Domokun

5
UseLayoutRendering = "True" जो मैंने उपयोग किया है - यह मेरी धुंधली छवियों को हल करने के लिए एकदम सही है। धन्यवाद!
मैट डिक्रे

25
आखिरकार!! UseLayoutRounding को डिफ़ॉल्ट रूप से सेट किया जाना चाहिए। छवियां कुछ स्थानों पर मूल और यहां तक ​​कि पाठ की तरह दिखाई देती हैं (जैसे कि कंटेक्स्टेनम, मेरे लिए कम से कम) पहले की तुलना में क्रिस्प दिखती हैं। धन्यवाद, डोमोकुन!
अनुदान

3
मुझे लगता है कि हम में से जो अभी भी .NET 3.5 पर अटके हैं, उनके पास कोई विकल्प नहीं है?
जिपरसन

2
मुझे लगता है कि यह मेरी समस्या को ठीक करता है अगर मैं संपत्ति खिंचाव को छवियों पर किसी को भी सेट नहीं करता हूं, लेकिन अन्य सभी परिदृश्यों में, यहां तक ​​कि हाईक्वालिटी इमेज रेंडरिंग और अलियासिंग बंद होने के बावजूद, छवि स्ट्रेचिंग अभी भी डब्ल्यूपीएफ में बेकार है। लेकिन, कम से कम इसने गैर-खींची गई छवियों के लिए समस्या को ठीक कर दिया है (जो पहली जगह में समस्या नहीं होनी चाहिए)
क्रिश्चियन फाइंडले

74

उपयोग SnapsToDevicePixelsकरने के बजाय, मैंने उपयोग कियाRenderOptions.BitmapScalingMode और वे अब अच्छे और कुरकुरा हैं!

XAML:

<Image Name="ImageOrderedList"
       Source="images/OrderedList.png"
       ToolTip="Ordered List"
       Margin="0,0,5,5"
       Width="20"
       Height="20"
       RenderOptions.BitmapScalingMode="NearestNeighbor"
       MouseUp="Image_MouseUp"
       MouseEnter="Image_MouseEnter"
       MouseLeave="Image_MouseLeave" />

1
इसके अलावा अगर आपकी छवि <Image> टैग में सटीक आकार की है, तो उसे इसे स्केल नहीं करना चाहिए और इसे क्रिस्प तरीके से प्रस्तुत करना चाहिए।
बेयर्डो

1
मुझे यकीन नहीं है कि यह एक अलग डीपीआई पर वांछित प्रभाव होगा
डेव

1
बेयरडो, दोनों स्रोत ग्राफ़िक और <छवि> दोनों 20 पिक्सेल से 20 पिक्सेल हैं। जैसा कि मैं इसे समझता हूं, मुद्दा WPF से आता है। यह मॉनीटर के पिक्सेल ग्रिड की अवहेलना करना चाहता है, इसलिए यह तार्किक ग्रिड आमतौर पर भौतिक ग्रिड के साथ पूरी तरह से लाइन में नहीं आएगा।
जैक पेटर्सन

9
@Zack Width = "20" का अर्थ 20 पिक्सेल नहीं है। इसका मतलब एक इंच का 20/96 है। यदि आपका OS 96 DPI पर चलने के लिए कॉन्फ़िगर किया गया है तो यह 20 पिक्सेल है। अब आपके नज़दीकी पड़ोसी कैसे नज़र रखेंगे, उदाहरण के लिए 160 DPI? और जब आप 300 डीपीआई पर प्रिंट करेंगे तो यह कैसा दिखेगा? आपको अपने देव मशीन के लिए अनुकूलन नहीं करना चाहिए।
फ्रैंक क्रुएगर

2
मैंने यह भी पाया कि पिक्सेल-आकार की छवियों के लिए नियरेस्टेनबोरर हाईक्वालिटी से बहुत बेहतर है, खासकर यदि आप इसे img.Width = imgSource.PixelWidth के साथ जोड़ते हैं; img.Height = imgSource.PixelHeight। मेरे क्लाइंट ने विभिन्न पागल DPI मूल्यों के साथ कुछ छवियां प्रदान कीं और मैं क्लाइंट को उन सभी को बदलने के लिए नहीं कह सकता, इसलिए मुझे इस हैक का उपयोग करना पड़ा।
जस्टअमार्टिन

23

जेक पीटरसन के लिए +1

मैं .net 3.5 sp1 का उपयोग कर रहा हूं और यह बड़ी संख्या में फ़ज़ी इमेज के लिए सबसे सरल समाधान की तरह दिखता है। RenderOptions को इन-प्लेस निर्दिष्ट करना कोई बड़ी बात नहीं है, लेकिन 3-पार्टी घटकों के लिए ऐप-स्तरीय संसाधन में एक शैली समझ में आती है:

 <Style TargetType="{x:Type Image}">
    <Setter
        Property="RenderOptions.BitmapScalingMode"
        Value="NearestNeighbor" />
 </Style>

एवलॉनडॉक ने धुंधले आइकॉन को प्रस्तुत करना शुरू किया जब अच्छी तरह से काम किया।


1
एवलॉनडॉक भी मुझे वही सिरदर्द दे रहा है ... और मैं अभी भी .Net 3.5 के साथ हूँ
इग्नासियो सोलर गार्सिया

9

का उपयोग करते हुए UseLayoutRounding="True"जड़ खिड़की पर कई मामलों में काम करता है लेकिन का उपयोग कर जब मैं कोई समस्या हुई है WPF रिबन नियंत्रण। मेरा आवेदन प्रासंगिक टैब पर निर्भर करता है जो उपयोगकर्ता द्वारा किए गए और जब मैं सेट करता हूं, उसके अनुसार दिखाई देता UseLayoutRoundingहैTrue , प्रासंगिक टैब न नहीं दिखाने के लिए और RibbonButton की छवि होगा। इसके अलावा, एप्लिकेशन कई सेकंड के लिए जमा देता है और सीपीयू प्रशंसक गाना शुरू कर देता है।

RenderOptions.BitmapScalingMode="NearestNeighbor"मेरी छवि का उपयोग करके छवि प्रदान करने वाले मुद्दों को ठीक किया (फ़र्ज़ी और फसली छवि) और रिबन प्रासंगिक टैब के उपयोग के साथ पूरी तरह से संगत है।


1
UseLayoutRounding = "ट्रू" ने मेरे लिए काम किया। धन्यवाद। mikecroteau.wordpress.com/2013/01/20/wpf-net-xaml-blurry-images
mcroteau

6

RenderOptions.BitmapScalingMode = "नियरेस्टीनेबोर" ज्यादातर समय अच्छी तरह से काम करता है। हालाँकि, कभी-कभी आपको ग्राफिकल ग्लिच मिलेगा (मेरे मामले में, 5 में से 4 चित्र ठीक दिखाई दिए, लेकिन पांचवें में दाहिने किनारे पर थोड़ी विकृति थी)। मैंने इसे छवि नियंत्रण के सही मार्जिन को 1 से बढ़ाकर तय किया।

यदि वह अभी भी इसे ठीक नहीं करता है, तो उस EugeneZ उल्लेख से ऊपर बिटमैप वर्ग नियंत्रण का प्रयास करें। यह छवि नियंत्रण के लिए एक प्रतिस्थापन है और अब तक यह मेरे लिए बहुत अच्छा काम कर रहा है। Http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx देखें


5

सुनिश्चित करें कि आप उसी डीपीआई में छवि को बचाएं क्योंकि आपका डब्ल्यूपीएफ एप्लिकेशन में काम कर रहा है, कुछ छवि प्रारूपों में यह जानकारी मेटाडेटा के रूप में संग्रहीत है। मुझे नहीं पता कि यह समस्या हल करता है, लेकिन मुझे इस वजह से कुछ समस्याएँ हुई हैं क्योंकि जहाँ पर 100% आकार वाले चित्र अपेक्षा से अधिक बड़े या छोटे होते हैं।

कुछ इसी तरह का हो सकता है।


5

UseLayoutRounding का उपयोग करें = अपने आवेदन में शीर्ष सबसे तत्व के लिए सही



3

मैंने पाया है कि RenderOptions.BitmapScalingMode = "NearestNeighbor" मेरे लिए काम नहीं करता है। मैं डायरेक्ट एक्स 9.0 सी के साथ विंडोज एक्सपी एक्स 32 का उपयोग कर रहा हूं। चूंकि WPF के लिए वास्तविक प्रतिपादन DirectX के साथ किया गया है, इसलिए इसका प्रभाव हो सकता है। मेरे पास निम्न रजिस्ट्री प्रविष्टियों के साथ XP के लिए एंटी-अलियासिंग चालू है:

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Avalon.Graphics] "MaxMultisampleType" = dword: 00000004 "EnableDebugControl" = dword: 00000001

हालाँकि, इन सेटिंग्स के साथ आॅन को बंद करने से छवियों पर कोई प्रभाव नहीं पड़ता है। मुझे लगता है कि यह केवल 3D व्यूपोर्ट को प्रभावित करता है।

अंत में, मैंने पाया कि पाठ के साथ ही छवियों के पाठ के साथ धुंधलापन होता है। और धुंधलापन केवल कुछ पाठ ब्लॉक और छवियों के लिए होता है, उन सभी में नहीं।


3

मैंने पाया है कि सुझाए गए वर्कअराउंड का कोई संयोजन मेरी प्रतीत होने वाली यादृच्छिक धुंधली छवि समस्या को ठीक नहीं करेगा। मुझे लगता है कि कई अन्य लोग UseLayoutRenderingसंपत्ति का उपयोग करने के लिए .net 4 में अपग्रेड नहीं कर सकते हैं।

मैंने क्या काम किया है:

  • सुनिश्चित करें कि आपकी [मूल] छवि आयाम 2 के गुणक हैं। यह फंकी इमेज स्केलिंग समस्याओं में से कुछ को रोकने के लिए लगता है।
  • कभी-कभी मैंने यह भी पाया है कि एक पिक्सेल या 2 द्वारा छवियों पर मार्जिन को समायोजित करने से समस्या को रोका जा सकता है।

1

मेरा पहला विचार, प्रश्न को पढ़ते हुए, क्या आप छवि को बहुत अधिक उड़ा रहे थे, लेकिन ऐसा प्रतीत नहीं होता है कि आपके पास एप्लिकेशन की छवि देख रहा है।

दूसरा विचार रंग पैलेट है, लेकिन काले रंग में से एक है जो सही तरीके से नहीं दे रहा है, यह संभावना नहीं है।

यदि आप उपरोक्त दोनों को पूरी तरह से नियंत्रित कर सकते हैं, तो मैं वर्तमान में स्टम्प्ड हूं।

एक प्रयोग के रूप में, आप अन्य ग्राफिक्स स्वरूपों की कोशिश कर सकते हैं, लेकिन पीएनजी ठीक होना चाहिए। मुझे बेहतर उत्तर के साथ आने के लिए कुछ और के माध्यम से सोचना होगा।


1
+1 से अनुचित मतों को हटाने के लिए क्योंकि मुझे लगता है कि आपने कुछ उचित सुझाव दिए हैं और केवल मदद करने की कोशिश कर रहे हैं और सबसे महत्वपूर्ण बात यह है कि आपके सुझावों में कुछ भी गलत नहीं था।
जिपरसन

1

मैंने RenderOptions.BitmapScalingMode = HighQuality का उपयोग करने की कोशिश की है, ऐसा लगता है कि विंडोज 8.1 में कुछ समस्याएं हैं, इसलिए मैंने उन्हें PngOut.exe नामक टूल के माध्यम से चलाने के लिए क्या किया

http://advsys.net/ken/utils.htm

जो पीएनजी के हेडर को कम करता है, और आकार को भी कम करता है, लेकिन छवि की गुणवत्ता को बदले बिना।

और अब मेरी सभी छवियां परिपूर्ण हैं! :-)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.