2010-10-26 14 views
17

Ho un'icona con alcune dimensioni diverse (16px, 32px, 64px). Sto chiamando ToBitmap() su di esso, ma restituisce sempre l'immagine a 32px. Come posso recuperare il 64px?Selezionare la dimensione di un System.Drawing.Icon?

+1

A proposito, questo è _System_.Drawing.Icon e 'ToBitmap()' _method_. – SLaks

+0

Ciao SLaks, hai ragione. Ci scusiamo per l'errore di battitura. –

risposta

11

Questa è una limitazione abbastanza dolorosa nella classe ResourceManager. Il suo metodo GetObject() non fornisce un modo per passare argomenti aggiuntivi che consentano di selezionare l'icona restituita per dimensione. Una soluzione alternativa è di aggiungere l'icona al progetto. Usa Progetto + Aggiungi elemento esistente, seleziona il tuo file .ico. Seleziona l'icona aggiunta e modifica la proprietà Build Action su "Embedded Resource".

È ora possibile recuperare l'icona desiderata con il codice come questo:

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"); 
    } 

utilizzo Esempio:

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

Attenzione una modalità di guasto possibili: questo codice si presuppone che l'icona è stata aggiunta alla stessa assembly che contiene il metodo.

+0

Non riuscivo a farlo funzionare. La stringa rname non includeva i nomi delle risorse all'interno del file –

+0

Questo ha funzionato per me. Le altre soluzioni non lo hanno fatto perché avevo bisogno dell'icona di un assemblaggio dato il suo percorso. Ho caricato l'assieme in un solo contesto di riflessione. È importante che l'icona sia una "Risorsa incorporata" nell'assembly; altrimenti, non funziona. – redcurry

+0

Utilizzando VS Express 15, ho impostato la proprietà 'Persistenza 'per Icon nel mio' Resources.resx' su 'Embedded in .resx'; è equivalente all'impostazione della proprietà 'Build Action' su' Embedded Resource'? –

0

Non esiste alcun metodo incorporato nel framework .Net che esegue questa operazione.

Invece, è possibile utilizzare this library.

0

La dimensione è determinata quando si crea prima l'istanza Icon, quindi è necessario specificare quale formato che si desidera utilizzare quando si crea, utilizzando uno dei Icon constructors che prendono un parametro Size.

+0

Ciao grazie. Questo avrebbe senso, ma la mia icona si trova all'interno di un file di risorse. Come modifico il costruttore? –

25

Questo aiuto?

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

Per fortuna, non è necessario copiare l'intera cosa in questo modo! – Ashe

18

Per chiunque altro inciampo sullo stesso problema, ho trovato un po 'di bella soluzione.

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

Sembrava molto tempo per questo; funziona alla grande! –

+0

Questo è esattamente. La risorsa icona contiene tutte le dimensioni, usa solo New() per ottenere quello che vuoi. –

3

Quanto segue imposta le dimensioni dell'icona per tutti i pulsanti nella barra degli strumenti.
Si basa sul nome della risorsa che viene memorizzato nel tag button.

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(); 
     } 
    } 
} 
Problemi correlati