我正在尝试将Bitmap转换为Icon并需要设置Bitmap的调色板(请参阅16 COLOR位图中的GetHicon返回颜色较少的图像).为此,我试图遵循这个答案:但我看到调色板是空的,我不能创建一个新的数组,因为我必须改变原来的.(我甚至尝试过它.它不起作用.)
我有:
ColorPalette palette = bitmap.Palette;
Color[] entries = palette.Entries;
Run Code Online (Sandbox Code Playgroud)
但是entries长度是零.
那么我该如何更改ColorPalette呢?
如上所述,位图文件不一定具有调色板.实际上,具有超过256种颜色的现代颜色文件不太可能(但仍然可以(我认为))使用调色板.相反,颜色信息来自像素值本身(而不是指向调色板表)
我从(http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/4a10d440-707f-48d7-865b-1d8804faf649/)找到了以下代码.我没有对它进行过测试(尽管作者声称"在VS 2008 c#中测试了.net 3.5").
它似乎自动处理缩小颜色数量...
[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);
}
}
}
Run Code Online (Sandbox Code Playgroud)