2010-10-26 13 views
17

मेरे पास एक आइकन है जिसमें कुछ अलग आकार हैं (16 पीएक्स, 32 पीएक्स, 64 पीएक्स)। मैं ToBitmap() पर कॉल कर रहा हूं, लेकिन यह हमेशा 32 पीएक्स छवि वापस कर रहा है। मैं 64px एक को कैसे प्राप्त करूं?सिस्टम का आकार चुनना। ड्रॉइंग.कॉन?

+1

वैसे, यह _System_.Drawing.Icon, और 'ToBitmap()' _method_ है। – SLaks

+0

हाय स्लाक्स, आप सही हैं। टाइपो के लिए खेद है। –

उत्तर

11

यह संसाधन प्रबंधक वर्ग में काफी दर्दनाक सीमा है। इसकी GetObject() विधि अतिरिक्त तर्कों को पारित करने का एक तरीका प्रदान नहीं करती है जो आकार के अनुसार लौटा आइकन चुनने की अनुमति देगी। इसके बजाय प्रोजेक्ट में आइकन जोड़ने का कामकाज है। प्रोजेक्ट का उपयोग करें + मौजूदा आइटम जोड़ें, अपनी .ico फ़ाइल का चयन करें। जोड़ा गया आइकन चुनें और बिल्ड एक्शन प्रॉपर्टी को "एंबेडेड रिसोर्स" में बदलें।

अब आप इस तरह के कोड के साथ वांछित आइकन को पुनः प्राप्त कर सकते हैं:

public static Icon GetIconFromEmbeddedResource(string name, Size size) { 
     var asm = System.Reflection.Assembly.GetExecutingAssembly(); 
     var rnames = asm.GetManifestResourceNames(); 
     var tofind = "." + name + ".ICO"; 
     foreach (string rname in rnames) { 
      if (rname.EndsWith(tofind, StringComparison.CurrentCultureIgnoreCase)) { 
       using (var stream = asm.GetManifestResourceStream(rname)) { 
        return new Icon(stream, size); 
       } 
      } 
     } 
     throw new ArgumentException("Icon not found"); 
    } 

नमूना उपयोग:

 var icon1 = GetIconFromEmbeddedResource("ARW04LT", new Size(16, 16)); 
     var icon2 = GetIconFromEmbeddedResource("ARW04LT", new Size(32, 32)); 

एक संभावित विफलता मोड सावधान: इस कोड को मानता है कि आइकन ही में जोड़ा गया था विधानसभा जिसमें विधि शामिल है।

+0

मैं इसे काम पर नहीं मिला। स्ट्रिंग रान में फ़ाइल –

+0

फ़ाइल के अंदर संसाधनों के नाम शामिल नहीं थे, यह मेरे लिए काम करता था। अन्य समाधान इसलिए नहीं थे क्योंकि मुझे एक असेंबली से आइकन की आवश्यकता थी। मैंने असेंबली को केवल प्रतिबिंब-संदर्भ में लोड किया। आइकन के लिए असेंबली में "एम्बेडेड संसाधन" होना महत्वपूर्ण है; अन्यथा, यह काम नहीं करता है। – redcurry

+0

वीएस एक्सप्रेस 15 का उपयोग करके, मैंने अपने 'resource.resx' में आइकन के लिए' Persistence' प्रॉपर्टी को'resx' में एम्बेडेड 'पर सेट किया है; क्या यह 'बिल्ड एक्शन' संपत्ति को 'एम्बेडेड संसाधन' पर सेट करने के बराबर है? –

0

नेट फ्रेमवर्क में कोई अंतर्निहित विधि नहीं है जो यह करता है।

इसके बजाय, आप this library का उपयोग कर सकते हैं। जब आप पहली बार Icon उदाहरण बनाने

0

आकार निर्धारित किया जाता है, ताकि आप Icon constructors कि एक Size पैरामीटर लेने से एक का उपयोग जो आकार आप बनाते समय आप इसके उपयोग करना चाहते हैं निर्दिष्ट करने की आवश्यकता,।

+0

हाय धन्यवाद। यह समझ में आता है, लेकिन मेरा आइकन संसाधन फ़ाइल के अंदर है। मैं कन्स्ट्रक्टर को कैसे संशोधित करूं? –

25

क्या इससे मदद मिलती है?

Icon sizedIcon = new Icon(Resources.ResourceIcon, new Size(64,64)); 
1
internal static class IconHelper { 
    public static Icon GetSize(this Icon icon, int width, int height) { 
     return icon.GetSize(new Size(width, height)); 
    } 

    public static Icon GetSize(this Icon icon, Size size) { 
     using(var mem = new MemoryStream()) { 
      icon.Save(mem); 
      mem.Position = 0; 
      return new Icon(mem, size); 
     } 
    } 
} 
+0

शुक्र है, इस तरह की पूरी चीज को कॉपी करने की आवश्यकता नहीं है! – Ashe

18

किसी और को एक ही समस्या पर ठोकर के लिए, मैं एक अच्छी छोटी समाधान मिल गया है।

Image img = new Icon(Properties.Resources.myIcon, width, height).ToBitmap() 
+0

इसके लिए एक लंबा समय देखा; बहुत अच्छा काम करता है! –

+0

यह बिल्कुल है। आइकन संसाधन में सभी आकार होते हैं, बस आप चाहते हैं कि प्राप्त करने के लिए नया() का उपयोग करें। –

3

निम्नलिखित टूलबार में सभी बटनों के लिए आइकन आकार सेट करता है।
यह बटन टैग में संग्रहीत संसाधन नाम पर निर्भर करता है।

public void SetButtons(object toolstrip, int IconWidth, int IconHeight) 
{ 
    var ts = (ToolStrip) toolstrip; 
    var size = new System.Drawing.Size(); 
    size.Height = IconSize; 
    size.Width = IconSize; 

    foreach (ToolStripButton tsBtn in ts.Items) 
    { 
     tsBtn.ImageScaling = ToolStripItemImageScaling.None; 
     var resourcename = (String) tsBtn.Tag; 
     if (resourcename != null) 
     { 
      var myIcon = (Icon) Properties.Resources.ResourceManager.GetObject(resourcename); 
      var newIcon = new Icon(myIcon, IconWidth, IconHeight); 
      tsBtn.Image = newIcon.ToBitmap(); 
     } 
    } 
} 
संबंधित मुद्दे