将位图转换为图标

时间:2011-11-17 21:13:40

标签: 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);

    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);
}

我已经做了很多努力来弄清楚问题,但却做不到。 请告诉我问题出在哪里。

4 个答案:

答案 0 :(得分:10)

请在GetHicon之后使用 DestroyIcon ,以防止内存泄漏

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

MSDN:https://msdn.microsoft.com/en-us/library/system.drawing.bitmap.gethicon%28v=vs.110%29.aspx

答案 1 :(得分:8)

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

http://www.go4expert.com/forums/showthread.php?t=19250

它看起来与你的相似:

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);
}

尝试一下。

已编辑:添加了使用声明。

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

SO questionhow to convert an image to an icon链接指向solution,可能会引导您朝着正确的方向前进。

但请注意,需要修改编写的代码以避免句柄泄漏。但{{3}}也与此问题相关联。