views:

52

answers:

2

Hi!

I need to save Bitmap object loaded from image file (.png, .jpeg, .bmp) and save it as an icon (.ico) to a separate file.

First I tried saving Bitmap object to a file with Icon ImageFormat:

using System.Drawing;

Bitmap bmp = (Bitmap)pictureBox1.Image;
bmp.Save(@"C:\icon.ico", Imaging.ImageFormat.Icon);

This one fails, as the icon produced is not in a proper format and it cannot be used as an icon.

Next one was to get HIcon from Bitmap and save it to a file:

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

This one does not do the job too. Although icon file is properly written, it has only 16 colors and a limited width and height.

I'd like to be able to write icons with custom width and height that would preserve colors from the original image. Is this possible to achive in .NET?

Thanks in advance.

+2  A: 

Hi,

Haven’t created icons myself this way but perhaps you could benefit from going from Graphics to Icon. Then you can select interpolation mode (which perhaps could be nice). See an example here: http://www.dreamincode.net/code/snippet1684.htm

Mikael
A: 
a working sample using the name space System.IO can be like this

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