2010-10-28 14 views
5

Potrzebuję zapisać obiekt Bitmap załadowany z pliku obrazu (.png, .jpeg, .bmp) i zapisać go jako ikonę (.ico) do osobnego pliku.Jak zapisać bitmap jako ikonę?

Najpierw próbowałem zapisywania obiektu Bitmap do pliku z ikoną ImageFormat:

using System.Drawing; 

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

Ten jeden nie powiedzie się, jak ikona produkowane nie jest w odpowiednim formacie i nie może być używany jako ikona.

Następny był dostać hIcon z Bitmap i zapisać go do pliku:

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(); 

Ten jeden nie wykonać zadanie zbyt. Chociaż plik ikony jest poprawnie napisany, ma tylko 16 kolorów oraz ograniczoną szerokość i wysokość.

Chciałbym móc pisać ikony o niestandardowej szerokości i wysokości, które zachowałyby kolory z oryginalnego obrazu. Czy jest to możliwe do osiągnięcia w .NET?

Z góry dziękuję.

+2

GetHicon() rzeczywiście robi gównianą robotę. Wypróbuj to: http://www.codeproject.com/KB/cs/IconLib.aspx –

+1

Użyłem tego również z powodzeniem: http://www.codeproject.com/KB/GDI-plus/safeicon.aspx –

Odpowiedz

-1

próbka robocza pomocą System.IO przestrzeń nazwa może być tak

[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, jest to tylko powtórzenie drugiego przykładu w moim pytaniu. –