2010-10-28 126 views
5

我需要保存從圖像文件(.png,.jpeg,.bmp)加載的Bitmap對象,並將其另存爲圖標(.ico),以將其保存爲單獨的文件。如何將位圖保存爲圖標?

首先我試圖保存位圖對象與圖標的imageformat一個文件:

using System.Drawing; 

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

這一個發生故障,作爲所產生的圖標是不是在適當的格式,並且它不能被用作一個圖標。

下一個是從位圖獲得惠康,並將其保存到一個文件:

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

這一次沒有做的工作太多。雖然圖標文件是正確書寫,它只有16種顏色和有限的寬度和高度。

我希望能夠寫出自定義寬度和高度的圖標,以保留原始圖像的顏色。這可能在.NET中存檔?

在此先感謝。

+2

GetHicon()工作示例確實做了糟糕的工作。試試這個:http://www.codeproject.com/KB/cs/IconLib.aspx – 2010-10-28 14:40:05

+1

我也用這個成功:http://www.codeproject.com/KB/GDI-plus/safeicon.aspx – 2011-09-28 02:16:04

回答

-1

使用名稱空間System.IO可就是這樣

[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,這只是我的問題中第二個例子的複製。 – 2010-11-08 16:36:47