Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将位图转换为图标_C#_.net_Winforms - Fatal编程技术网

C# 将位图转换为图标

C# 将位图转换为图标,c#,.net,winforms,C#,.net,Winforms,我正在尝试将位图转换为图标。但是有一些错误,因为结果文件是空的 private void btnCnvrtSave_Click(object sender, EventArgs e) { Bitmap bmp = new Bitmap(sourceFile); //sourceFile = openfiledialog.FileName; IntPtr Hicon = bmp.GetHicon(); Icon myIcon = Icon.FromHandle(Hicon

我正在尝试将位图转换为图标。但是有一些错误,因为结果文件是空的

private void btnCnvrtSave_Click(object sender, EventArgs e)
{
    Bitmap bmp = new Bitmap(sourceFile);  //sourceFile = openfiledialog.FileName;
    IntPtr Hicon = bmp.GetHicon();
    Icon myIcon = Icon.FromHandle(Hicon);

    SaveFileDialog sfd = new SaveFileDialog();
    sfd.Title = "Save Icon";
    sfd.Filter = "Icon|*.ico";
    sfd.ShowDialog();

    FileStream fileStream = new FileStream(sfd.FileName, FileMode.OpenOrCreate);
    myIcon.Save(fileStream);
    fileStream.Flush();
    fileStream.Close();

    MessageBox.Show("Image is converted successfully!");

    //Process.Start(sfd.FileName);
}
我已经试了很多次想弄明白这个问题,但都没能解决。
请告诉我问题出在哪里。

本文介绍如何将位图转换为图标

它看起来和你的非常相似:

using (Cbitmap = new Bitmap(sourceImage.Text))
{
    Cbitmap.MakeTransparent(Color.White);
    System.IntPtr icH = Cbitmap.GetHicon();
    Icon ico = Icon.FromHandle(icH);
}
using (System.IO.FileStream f = new System.IO.FileStream(destinationFldr.Text + "\\image.ico", System.IO.FileMode.OpenOrCreate))
{
    ico.Save(f);
}
试试看

编辑:添加了using语句。

此外,此链接指向,这可能会引导您走向正确的方向


但是,请注意,编写的代码需要修改以避免句柄泄漏。但是在这个问题上也有链接。

此代码的唯一问题是它支持高达128x128的位图图像


如果位图的大小更大,则会生成一个空白ico文件。

请在获取图标后使用销毁图标,以防止内存泄漏

[DllImport("user32.dll", CharSet = CharSet.Auto)]
extern static bool DestroyIcon(IntPtr handle);

MSDN:

您是否检查了
myIcon
是否包含有效数据?请查看这里@EnigmaState您的评论可以为标题myIcon.Dispose()提供一个合理的答案,或者我们必须按照您的要求执行吗?是否有一种可移植的方法来执行此操作?