2010-02-01 14 views

Respuesta

7

Un .ico archivo puede tener varias imágenes en el mismo, pero cuando se carga un archivo .ico y crear un objeto Icon, sólo una de esas imágenes está cargado. Windows elige la imagen más adecuada según el modo de visualización actual y la configuración del sistema, y ​​utiliza esa para inicializar el objeto System.Drawing.Icon, ignorando los demás.

Así que no puede crear un System.Drawing.Icon con varias imágenes, debe elegir una antes de crear el objeto Icon.

Por supuesto, es posible crear un icono en tiempo de ejecución a partir de un mapa de bits, ¿eso es lo que realmente está pidiendo? ¿O preguntas cómo crear un archivo .ico?

+1

Pero si me carga un archivo .ico como he mostrado anteriormente, puedo acceder a la 16x16, 32x32, 48x48, etc. como esto -: Icono smallIcon = new Icon (myIcon, 16, 16); – Damien

+2

Porque sabe de qué archivo/recurso se creó el icono y puede volver a él y obtener una nueva imagen. Sin embargo, no hay manera de AGREGAR una imagen a un objeto Icon. –

+0

@JohnKnoeller En realidad, eso no es realmente cierto. Todos los datos de imagen son cargados por la clase 'Icon' en la memoria y cuando cambia el tamaño de otro objeto' Icon', los datos de imagen se comparten y el tamaño más cercano se extrae de los datos originales (compartidos). – NetMage

0

Hay un bonito code snippet here. Utiliza el método Icon.FromHandle.

Desde el enlace:

/// <summary> 
/// Converts an image into an icon. 
/// </summary> 
/// <param name="img">The image that shall become an icon</param> 
/// <param name="size">The width and height of the icon. Standard 
/// sizes are 16x16, 32x32, 48x48, 64x64.</param> 
/// <param name="keepAspectRatio">Whether the image should be squashed into a 
/// square or whether whitespace should be put around it.</param> 
/// <returns>An icon!!</returns> 
private Icon MakeIcon(Image img, int size, bool keepAspectRatio) { 
    Bitmap square = new Bitmap(size, size); // create new bitmap 
    Graphics g = Graphics.FromImage(square); // allow drawing to it 

    int x, y, w, h; // dimensions for new image 

    if(!keepAspectRatio || img.Height == img.Width) { 
    // just fill the square 
    x = y = 0; // set x and y to 0 
    w = h = size; // set width and height to size 
    } else { 
    // work out the aspect ratio 
    float r = (float)img.Width/(float)img.Height; 

    // set dimensions accordingly to fit inside size^2 square 
    if(r > 1) { // w is bigger, so divide h by r 
     w = size; 
     h = (int)((float)size/r); 
     x = 0; y = (size - h)/2; // center the image 
    } else { // h is bigger, so multiply w by r 
     w = (int)((float)size * r); 
     h = size; 
     y = 0; x = (size - w)/2; // center the image 
    } 
    } 

    // make the image shrink nicely by using HighQualityBicubic mode 
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
    g.DrawImage(img, x, y, w, h); // draw image with specified dimensions 
    g.Flush(); // make sure all drawing operations complete before we get the icon 

    // following line would work directly on any image, but then 
    // it wouldn't look as nice. 
    return Icon.FromHandle(square.GetHicon()); 
} 
+3

Creo que quiere crear un icono con varias imágenes ... –

0

Puede intentar usar png2ico para crear un archivo .ico, invocándolo usando System.Diagnostics.Process.Start. Debería crear sus imágenes y guardarlas en un disco antes de invocar png2ico.

Cuestiones relacionadas