2012-12-28 14 views
7

यदि आप निम्न छवि पर विचार करते हैं, तो यह 32x32 पर आकार का एक बिल्कुल मूल आइकन है। आइकन के चारों ओर एक पारदर्शी आयताकार है, हालांकि परीक्षण के दौरान मैंने ठोस कोनों के साथ चार कोनों में भर दिया।ग्राफिक्स.DrawImage क्यों मेरी छवि का हिस्सा फसल है?

Source Image

अब इस कोड है, जो बस छवि ड्रॉ पर विचार, लेकिन एक बड़े पैमाने पर:

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor; 
    e.Graphics.DrawImage(Properties.Resources.icon_32a, new RectangleF(0, 0, 512, 512), new RectangleF(0, 0, 32, 32), GraphicsUnit.Pixel); 
} 

ध्यान दें कि मैं पूर्ण छवि ड्राइंग कर रहा हूँ और मैं फसल के लिए प्रयास कर नहीं कर रहा हूँ यह किसी भी तरह से, बस इसे बड़ा करें।

Painted example

समस्या नोटिस:

अंत में, इस उत्पादन परीक्षण मुझे देता है? शीर्ष पंक्ति और बाएं कॉलम में पिक्सल का आधा गायब हो गया है। यदि मैं इसके ऊपर एक ग्रिड को आज़माकर ओवरले करता हूं, तो यह बहुत भयानक लग रहा है क्योंकि ग्रिड सही ढंग से गठबंधन है, लेकिन छवि नहीं है। आकार को 64 तक दोगुना करने के लिए, 64 इस पहली पंक्ति/कॉलम फसल का परिचय देता है।

नोट, मैंने गंतव्य आयत को ऑफ़सेट करने का भी प्रयास किया, अगर यह 0,0 से पहले चित्रित हो रहा था, लेकिन ऐसा नहीं था।

मैंने विभिन्न इंटरपोलेशन मोड का उपयोग करने का भी प्रयास किया, लेकिन जहां तक ​​मैं सिरदर्द प्रेरक धुंध के माध्यम से बता सकता था, पिक्सल अभी भी फसल हो गए थे, इसलिए मुझे विश्वास नहीं है कि यह इंटरपोलेशन मोड के कारण है।

मैंने विभिन्न ग्राफिक्स मोड का उपयोग करने का भी प्रयास किया, लेकिन इस तथ्य से अलग कि यह मदद नहीं कर रहा था, मुझे वैसे भी पिक्सल के साथ चिपकने की जरूरत है।

मैंने जिज्ञासा से 96 डीपीआई पर छवि की एक नई प्रतिलिपि के साथ फिर कोशिश की और मुझे एक ही प्रभाव मिला, इसलिए मुझे नहीं लगता कि यह स्रोत छवियों का संकल्प है।

स्ट्रॉ पर क्लचिंग और RectangleF के बजाय इसका कोई प्रभाव नहीं पड़ा।

कोई भी इस बात का कोई संकेत दे सकता है कि यह स्पष्ट फसल क्यों हो रही है?

धन्यवाद;

उत्तर

7

PixelOffsetModePixelOffsetMode.Half को सेट किया जाता है:

, निर्दिष्ट करता है कि पिक्सल -.5 इकाइयों की भरपाई कर रहे हैं, दोनों क्षैतिज और खड़ी उच्च गति एंटीलायज़िंग़ के लिए।

आपके मामले में मूल छवि में आधा पिक्सेल परिणामी छवि में 8 पिक्सेल है, जो वास्तव में आप गायब हैं।

PixelOffsetMode.None के लिए यह सेट करके देखें:

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    e.Graphics.PixelOffsetMode = PixelOffsetMode.None; 
    e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor; 
    e.Graphics.DrawImage(Properties.Resources.icon_32a, new RectangleF(0, 0, 512, 512), new RectangleF(0, 0, 32, 32), GraphicsUnit.Pixel); 
} 
+6

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

+0

मुझे एक ही समस्या थी। 'पिक्सेल ऑफसेट मोड' संपत्ति के बारे में भी जानकारी नहीं थी। फिर, स्पष्ट सेटिंग होने के बावजूद 'पिक्सेलऑफसेटमोड.None' मेरे लिए काम नहीं किया लेकिन' पिक्सेल ऑफसेट मोड। हाईक्यूविटी 'ने काम किया। –

1

बस जबाब उपयोगकर्ताओं द्वारा comfirmed को कवर, मैं इसे अपने आप की कोशिश की और समस्या PixelOffsetMode.HighQuality बजाय none के साथ हल किया गया था।

C#

e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

मेरे मामले C++ में कामयाब रहे:

e->graphics->PixelOffsetMode = System::Drawing::Drawing2D::PixelOffsetMode::HighQuality; 
संबंधित मुद्दे