2009-02-19 12 views
7

मैं एक सी # फॉर्म (चित्र बॉक्स में, साथ ही ग्राफिक्स.ड्राइमेज()) का उपयोग करके छवियों को आकर्षित करने की कोशिश कर रहा हूं, और चिकनी खींचने का एक तरीका ढूंढ रहा हूं। छवियां एक प्रारूप होना चाहिए जो पारदर्शिता का समर्थन करता है, इसलिए पीएनजी, जीआईएफ, एसवीजी, और डब्लूएमएफ। सी # बॉक्स से बाहर एसवीजी फाइलों का समर्थन नहीं करता है, और मुझे उपयोग करने के लिए एक अच्छी तीसरी पार्टी लाइब्रेरी नहीं मिली है (मुझे एसवीजीनेट मिला, लेकिन इसे समझ नहीं सका)।सी # के साथ चिकनी छवियों को कैसे आकर्षित करें?

मुझे डब्लूएमएफ फ़ाइल खींचने की ज़रूरत है, जो सी # Image.FromFile() फ़ंक्शन के माध्यम से कर सकता है, लेकिन यह एंटी-एलाइज्ड नहीं है। मैं सोच रहा था कि क्या इसे सुलझाने का कोई तरीका है?

उत्तर

7

जब एक कैनवास के लिए छवि ड्राइंग, आप आकृति परिवर्तन छवियों को सहज बनाने के लिए कुछ अच्छे तो निकटतम पड़ोसी के प्रक्षेप मोड बदल सकते हैं:

Graphics g = ... 
g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
g.DrawImage(...); 

आप पाने के लिए System.Drawing.Drawing2D जोड़ने की आवश्यकता होगी इंटरपोलेशन मोड एनम।

पिक्चरबॉक्स का उपयोग करना एक समस्या होगी - यह इंटरपोलेशन मोड संपत्ति का पर्दाफाश नहीं करता है, इसलिए आपको अपना खुद का रोल या डाउनलोड करना होगा।

+0

किसी भी विचार है जहाँ मैं एक डाउनलोड एक, या कैसे अपने ही करने के बारे में जाने के लिए मिल सकता है? मैं एक नौसिखिया सी # डेवलपर हूं, और अपना खुद का लेखन एक ऐसा कार्य हो सकता है जो मेरी वर्तमान क्षमताओं से थोड़ा सा है। –

+0

एक नौसिखिया के रूप में अपनी खुद की कक्षा को घुमाने शुरू करने का सबसे आसान तरीका पैनल नियंत्रण रखना होगा, और उसके बाद अपनी पेंट इवेंट (गुण विंडो पर, घटनाओं का चयन करें [बिजली आइकन] चुनें और फिर सूची में पेंट ईवेंट के बगल में डबल क्लिक करें)। प्रतिस्थापन ड्रा कोड लिखने के लिए e.Graphics param का उपयोग करें। – David

+0

ग्रेट ग्रेट ग्रेट, लाख धन्यवाद – bebosh

15

पिछले उत्तरों, जबकि अच्छी तरह से इरादा केवल आंशिक रूप से सही थे।

क्या सही था? पिक्चरबॉक्स इंटरपोलेशन मोड का पर्दाफाश नहीं करता है।

आधार से क्या था?

1) जबकि आप चित्र बॉक्स से, अपने माता-पिता में, या व्युत्पन्न कक्षा में ओवरराइड के माध्यम से पेंट ईवेंट में आसानी से उस संपत्ति को सेट कर सकते हैं। । । किसी भी तरह से काम करता है और दोनों बस इतना आसान हैं। हालांकि, जब तक SmoothingMode सेट नहीं किया जाता है, इंटरपोलेशन मोड को अनदेखा कर दिया जाएगा। SmoothingMode को SmoothingMode.AnitAlias ​​पर सेट किए बिना आपको एंटी-एलाइजिंग नहीं मिलेगी।

2) जब आप पिक्चरबॉक्स की विशेषताओं का उपयोग करने में रुचि व्यक्त करते हैं तो पैनल का उपयोग करना गलत दिशा है। आपको उन गुणों को स्पष्ट रूप से कोड किए बिना सीधे छवियों को लोड, सहेजने या असाइन करने की कोई क्षमता नहीं होगी। । । पहिया का पुनः आविष्कार क्यों किया? पिक्चरबॉक्स से निकलने से आप इसे मुफ्त में प्राप्त कर सकते हैं।

समाचार आपके लिए कड़ी मेहनत आपके लिए किया गया है और यह संदेश लिखने से मुझे कम समय लगता है।

मैंने दो संस्करण प्रदान किए हैं जिनमें से दोनों पिक्चरबॉक्स से प्राप्त हुए हैं। पहले एक साधारण उदाहरण है जो हमेशा सर्वोत्तम गुणवत्ता प्रतिपादन का उपयोग करता है। यह भी सबसे धीमी प्रतिपादन है। दूसरा एक ऐसा वर्ग है जो किसी को भी व्युत्पन्न वर्ग के गुणों के माध्यम से विभिन्न प्रतिपादन पैरामीटर सेट करने की अनुमति देता है। इन्हें सेट करने के बाद ऑनपेंट ओवरराइड में उपयोग किया जाता है।

public class HighQualitySmoothPictureBox : PictureBox 
{ 
    protected override void OnPaint(PaintEventArgs pe) 
    { 
     // This is the only line needed for anti-aliasing to be turned on. 
     pe.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 

     // the next two lines of code (not comments) are needed to get the highest 
     // possible quiality of anti-aliasing. Remove them if you want the image to render faster. 
     pe.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
     pe.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
     // this line is needed for .net to draw the contents. 
     base.OnPaint(pe); 
    } 
} 

...

public class ConfigurableQualityPictureBox : PictureBox 
{ 
    // Note: the use of the "?" indicates the value type is "nullable." 
    // If the property is unset, it doesn't have a value, and therefore isn't 
    // used when the OnPaint method executes. 
    System.Drawing.Drawing2D.SmoothingMode? smoothingMode; 
    System.Drawing.Drawing2D.CompositingQuality? compositingQuality; 
    System.Drawing.Drawing2D.InterpolationMode? interpolationMode; 

    public System.Drawing.Drawing2D.SmoothingMode? SmoothingMode 
    { 
     get { return smoothingMode; } 
     set { smoothingMode = value; } 
    } 

    public System.Drawing.Drawing2D.CompositingQuality? CompositingQuality 
    { 
     get { return compositingQuality; } 
     set { compositingQuality = value; } 
    } 

    public System.Drawing.Drawing2D.InterpolationMode? InterpolationMode 
    { 
     get { return interpolationMode; } 
     set { interpolationMode = value; } 
    } 

    protected override void OnPaint(PaintEventArgs pe) 
    { 
     if (smoothingMode.HasValue) 
      pe.Graphics.SmoothingMode = smoothingMode.Value; 
     if (compositingQuality.HasValue) 
      pe.Graphics.CompositingQuality = compositingQuality.Value; 
     if (interpolationMode.HasValue) 
      pe.Graphics.InterpolationMode = interpolationMode.Value; 

     // this line is needed for .net to draw the contents. 
     base.OnPaint(pe); 
    } 
} 
+0

एक बहुत अच्छा जवाब। केवल एक चीज जो मैं जोड़ूंगा वह कुछ विशेषताओं जैसे ब्राउज़ करने योग्य, टूलबॉक्स इटिम, विवरण और श्रेणी है जो VisualDesigner में इस नियंत्रण का उपयोग करने में सक्षम हैं। – 0xBADF00D

+2

@hichaeretaqua आपके तरह के शब्दों के लिए धन्यवाद। मैं सहमत हूं कि अंतिम कार्यान्वयन के लिए उन विशेषताओं की आवश्यकता होगी। हालांकि, मुझे लगता है कि आइटम सीधे अव्यवस्था के जवाब से संबंधित नहीं हैं और इच्छित संदेश से एक शिक्षार्थी को विचलित कर सकते हैं। यही कारण है कि मैंने उन्हें प्रदान नहीं किया। –

संबंधित मुद्दे