2010-10-28 7 views
5

Je dois enregistrer l'objet bitmap chargé à partir du fichier image (.png, .jpeg, .bmp) et l'enregistrer sous forme d'icône (.ico) dans un fichier séparé.Comment enregistrer Bitmap en tant qu'icône?

Tout d'abord j'ai essayé sauver objet Bitmap dans un fichier avec l'icône ImageFormat:

using System.Drawing; 

Bitmap bmp = (Bitmap)pictureBox1.Image; 
bmp.Save(@"C:\icon.ico", Imaging.ImageFormat.Icon); 

Celui-ci échoue, comme l'icône produit n'est pas dans un format approprié et il ne peut pas être utilisé comme une icône.

suivant était d'obtenir Hicon de Bitmap et l'enregistrer dans un fichier:

using System.Drawing; 
using System.IO; 

StreamWriter iconWriter = new StreamWriter(@"C:\icon.ico"); 
Icon ico = Icon.FromHandle(((Bitmap)pictureBox1.Image).GetHicon()) 
ico.Save(iconWriter.BaseStream); 
iconWriter.Close(); 
iconWriter.Dispose(); 

Celui-ci ne fait pas le travail aussi. Bien que le fichier d'icônes soit correctement écrit, il n'a que 16 couleurs et une largeur et une hauteur limitées. J'aimerais pouvoir écrire des icônes avec une largeur et une hauteur personnalisées qui préserveraient les couleurs de l'image d'origine. Est-ce possible de réaliser en .NET?

Merci d'avance.

+2

GetHicon() ne fait un travail merdique. Essayez ceci: http://www.codeproject.com/KB/cs/IconLib.aspx –

+1

J'ai également utilisé ceci avec succès: http://www.codeproject.com/KB/GDI-plus/safeicon.aspx –

Répondre

-1

un échantillon de travail en utilisant l'espace de nom System.IO peut être comme ça

[System.Runtime.InteropServices.DllImport("user32.dll")] 
extern static bool DestroyIcon(IntPtr handle); 

private void buttonConvert2Ico_Click(object sender, EventArgs e) 
{ 
    OpenFileDialog openFileDialog1 = new OpenFileDialog 

    openFileDialog1.InitialDirectory = "C:\\Data\\"; 
    openFileDialog1.Filter = "BitMap(*.bmp)|*.bmp"; 
    openFileDialog1.FilterIndex = 2; 
    openFileDialog1.RestoreDirectory = true; 

    if(openFileDialog1.ShowDialog() == DialogResult.OK) 
    { 
     try 
     { 
      string sFn = openFileDialog1.FileName; 
      MessageBox.Show("Filename=" + sFn); 
      string destFileName = sFn.Substring(0, sFn.Length -3) +"ico"; 

      // Create a Bitmap object from an image file. 
      Bitmap bmp = new Bitmap(sFn); 

      // Get an Hicon for myBitmap. 
      IntPtr Hicon = bmp.GetHicon(); 

      // Create a new icon from the handle. 
      Icon newIcon = Icon.FromHandle(Hicon); 

      //Write Icon to File Stream 
      System.IO.FileStream fs = new System.IO.FileStream(destFileName, System.IO.FileMode.OpenOrCreate); 
      newIcon.Save(fs); 
      fs.Close(); 
      DestroyIcon(Hicon); 

      //DestroyIcon(hIcon); 
      setStatus("Created icon From=" + sFn + ", into " + destFileName); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error: Could not read/write file. Original error: " + ex.Message); 
     } 
    } 
} 
+1

Chris, c'est seulement une réplique du deuxième exemple dans ma question. –

Questions connexes