c# - Seleccionando el tamaño de un System.Drawing.Icon?
icons size (7)
¿Esto ayuda?
Icon sizedIcon = new Icon(Resources.ResourceIcon, new Size(64,64));
Tengo un icono que tiene diferentes tamaños (16px, 32px, 64px). Estoy llamando a ToBitmap()
en él, pero siempre está devolviendo la imagen de 32px. ¿Cómo recupero el 64px uno?
El tamaño se determina la primera vez que crea la instancia de Icon
, por lo que debe especificar qué tamaño desea utilizar cuando lo crea, utilizando uno de los constructores de Icon
que toman un parámetro Size
.
Esta es una limitación bastante dolorosa en la clase ResourceManager. Su método GetObject () no proporciona una manera de pasar argumentos adicionales que permitirían seleccionar el icono devuelto por tamaño. Una solución es agregar el ícono al proyecto en su lugar. Use Proyecto + Agregar elemento existente, seleccione su archivo .ico. Seleccione el icono agregado y cambie la propiedad Crear acción a "Recurso incrustado".
Ahora puede recuperar el icono deseado con un código como este:
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");
}
Uso de la muestra:
var icon1 = GetIconFromEmbeddedResource("ARW04LT", new Size(16, 16));
var icon2 = GetIconFromEmbeddedResource("ARW04LT", new Size(32, 32));
Tenga cuidado con un posible modo de falla: este código asume que el icono se agregó al mismo ensamblaje que contiene el método.
Lo siguiente establece el tamaño del icono para todos los botones en la barra de herramientas.
Se basa en el nombre del recurso que se almacena en la etiqueta del botón.
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();
}
}
}
No hay ningún método incorporado en el marco .Net que haga esto.
En su lugar, puede utilizar esta biblioteca .
Para cualquier otra persona que encuentre el mismo problema, he encontrado una pequeña solución.
Image img = new Icon(Properties.Resources.myIcon, width, height).ToBitmap()
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);
}
}
}