2010-02-01 15 views

Antwort

7

eine ICO-Datei mehrere Bilder in ihm haben können, aber wenn Sie eine ICO-Datei laden und ein Icon-Objekt erstellen, wird nur eines dieser Bilder geladen wird. Windows wählt das am besten geeignete Bild basierend auf dem aktuellen Anzeigemodus und den Systemeinstellungen aus und verwendet dieses zum Initialisieren des Objekts System.Drawing.Icon, wobei die anderen ignoriert werden.

Sie können also keine System.Drawing.Icon mit mehreren Bildern erstellen, Sie müssen eine auswählen, bevor Sie das Objekt Icon erstellen.

Natürlich ist es möglich, ein Icon zur Laufzeit aus einer Bitmap zu erstellen, ist das, was Sie wirklich fragen? Oder fragen Sie, wie Sie eine .ico-Datei erstellen?

+1

Aber wenn ich eine ICO-Datei laden, wie ich habe oben gezeigt, ich die 16x16 zugreifen können, 32x32, 48x48 usw. wie folgt aus: - Icon smallIcon = neues Icon (myIcon, 16, 16); – Damien

+2

Da es weiß, aus welcher Datei/Ressource das Icon erstellt wurde, kann es zurückgehen und ein neues Image erhalten. Es gibt jedoch keine Möglichkeit, ein Bild einem Icon-Objekt hinzuzufügen. –

+0

@JohnKnoeller Eigentlich stimmt das nicht wirklich. Alle Bilddaten werden von der Icon-Klasse in den Speicher geladen, und wenn Sie die Größe eines anderen Icon-Objekts ändern, werden die Bilddaten geteilt und die nächste Größe wird aus den ursprünglichen (geteilten) Daten gezogen. – NetMage

0

Es gibt eine nette code snippet here. Es verwendet die Icon.FromHandle Methode.

Aus dem Link:

/// <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

Ich glaube, er will ein Symbol mit mehreren Bildern erstellen ... –

0

Sie könnten versuchen, png2ico zu verwenden, um eine ICO-Datei zu erstellen, die es unter Verwendung von System.Diagnostics.Process.Start aufruft. Sie müssten Ihre Bilder erstellen und auf der Festplatte speichern, bevor Sie png2ico aufrufen.

Verwandte Themen