ColorPalette bitmap has an array of length 0 as Records

I am trying to convert Bitmap to an icon and you need to set the Bitmap palette (see GetHicon of 16 COLOR bitmap returns an image with fewer colors ). For this I am trying to execute this answer : but I see that the palette is empty and I can’t create a new one array because I need to change the original one. (I even tried this anyway. It doesn't work.)

I have:

ColorPalette palette = bitmap.Palette; Color[] entries = palette.Entries; 

But the length of entries is zero.

So how do I change the ColorPalette?

+4
source share
1 answer

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); } } } 
+5
source

All Articles