As indicated, the raster file will not necessarily have a palette. Indeed, modern color files with more than 256 colors are unlikely (but still can (I think)) use the palette. Instead, the color information comes from the pixel values ββthemselves (instead of pointing to the palette table).
I found the following code from ( http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/4a10d440-707f-48d7-865b-1d8804faf649/ ). I have not tested it (although the author claims to be "tested in VS 2008 C # with .net 3.5").
It seems to automatically reduce the number of colors ...
[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); setStatus("Created icon From=" + sFn + ", into " + destFileName); } catch (Exception ex) { MessageBox.Show("Error: Could not read/write file. Original error: " + ex.Message); } } }
source share