2011-11-17 21 views
16

Estoy tratando de convertir el mapa de bits en un icono. Pero hay algún error ya que el archivo resultante está en blanco.Convertir mapa de bits en el icono

private void btnCnvrtSave_Click(object sender, EventArgs e) 
{ 
    Bitmap bmp = new Bitmap(sourseFile); //sourseFile = 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); 
} 

He intentado resolver el problema pero no pude. Por favor, dime dónde está el problema.

+2

¿Ha comprobado que 'myIcon' contiene datos válidos? – ChrisF

+0

este código se ejecuta con éxito para mí y me da un ícono, ¿cuál es tu problema? –

+0

pls échele un vistazo aquí http://www.codeproject.com/KB/GDI-plus/safeicon.aspx –

Respuesta

3

El único problema con este código es que admite imágenes de mapa de bits de hasta 128x128.

Proporciona un archivo ico en blanco si el tamaño del mapa de bits es mayor.

6

En este artículo se describe cómo convertir un mapa de bits en un icono.

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

se ve muy similar a su ser:

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

probarlo.

EDITADO: Se agregaron las instrucciones de uso.

2

Además, este SO question enlaces a how to convert an image to an icon, lo que puede llevarlo en la dirección correcta.

Observe, sin embargo, que el código escrito debe modificarse para evitar una fuga de identificador. Pero el solution también está vinculado en esa pregunta.

9

Por favor, use DestroyIcon después GetHicon, para evitar la pérdida de memoria

[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

+0

¿MyIcon.Dispose() es suficiente o tenemos que hacer lo que usted dijo? – farukdgn

+0

@farukdgn no, no es suficiente ... – Nigrimmist

+0

¿No hay una forma portátil de hacerlo? –

Cuestiones relacionadas