C# 如何将位图保存为图标?
我需要保存从图像文件(.png、.jpeg、.bmp)加载的位图对象,并将其作为图标(.ico)保存到单独的文件中 首先,我尝试将位图对象保存到具有图标ImageFormat的文件中:C# 如何将位图保存为图标?,c#,.net,vb.net,icons,bitmap,C#,.net,Vb.net,Icons,Bitmap,我需要保存从图像文件(.png、.jpeg、.bmp)加载的位图对象,并将其作为图标(.ico)保存到单独的文件中 首先,我尝试将位图对象保存到具有图标ImageFormat的文件中: using System.Drawing; Bitmap bmp = (Bitmap)pictureBox1.Image; bmp.Save(@"C:\icon.ico", Imaging.ImageFormat.Icon); 此操作失败,因为生成的图标格式不正确,无法用作图标 下一步是从位图中获取HIcon
using System.Drawing;
Bitmap bmp = (Bitmap)pictureBox1.Image;
bmp.Save(@"C:\icon.ico", Imaging.ImageFormat.Icon);
此操作失败,因为生成的图标格式不正确,无法用作图标
下一步是从位图中获取HIcon并将其保存到文件:
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中实现吗
提前感谢。使用名称空间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);
}
}
}
GetHicon()确实做得很差劲。试试这个:我也成功地使用了这个:克里斯,这只是我问题中第二个例子的复制品。