Convert bitmap to icon

2020-07-01 02:00发布

I am trying to convert bitmap into icon. But there is some error as the resultant file is just blank.

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

I've tried a lot to figure-out the problem but couldn't. Please tell me where the problem is.

标签: c# .net winforms
4条回答
来,给爷笑一个
2楼-- · 2020-07-01 02:13

Please, use DestroyIcon after GetHicon, to prevent memory leak

[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

查看更多
Bombasti
3楼-- · 2020-07-01 02:14

This article describes how to convert a bitmap to an icon.

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

It looks very similiar to your one:

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

Try it out.

EDITED: Added the using statements.

查看更多
神经病院院长
4楼-- · 2020-07-01 02:27

The only problem with this code is that it supports bitmap images upto 128x128.

It yields a blank ico file if the size of bitmap is greater.

查看更多
一夜七次
5楼-- · 2020-07-01 02:28

Also, this SO question links to how to convert an image to an icon, which may lead you in the right direction.

Notice, however, that the code as written needs to be modified to avoid a handle leak. But the solution is also linked in that question.

查看更多
登录 后发表回答