2010-07-15 14 views

Respuesta

21

Usted ir a través de un MemoryStream, básicamente:

public static byte[] IconToBytes(Icon icon) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     icon.Save(ms); 
     return ms.ToArray(); 
    } 
} 

public static Icon BytesToIcon(byte[] bytes) 
{ 
    using (MemoryStream ms = new MemoryStream(bytes)) 
    { 
     return new Icon(ms); 
    } 
} 

(Nota histórica:. No estaba segura de si era o no seguro para desechar el flujo pasado al constructor Se no es . seguro hacerlo para Bitmap, por ejemplo ... que se aferra a la corriente y puede leer de él más adelante Aparentemente está bien que Icon aunque me gustaría MSDN hizo esto más claro ...)

+0

Vale la pena señalar que los bytes "guardados" aquí son exactamente los mismos que los bytes escritos en un archivo (por lo que incluye encabezado de archivo, cualquier compresión aplicable, etc.) no los bytes de la imagen en sí. –

+0

Sí, podría convertirlo en un mapa de bits y extraer la matriz de píxeles si fuera necesario. –

+0

Simplemente curioso, envolviste prolijamente 'MemoryStream' en un bloque de uso, ¿por qué no hiciste igual en el método inverso de 'BytesToIcon'? Ya no es necesario desechar el ms? – Abel

1

Ver:. http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/1551fd3b-02b6-4479-852a-dfea4b610c35

Ex (hay múltiples maneras)

private byte[] GetBytes(Icon icon) 
{ 
    MemoryStream ms = new MemoryStream(); 
    icon.Save(ms); 
    return ms.ToArray(); 
} 

Y:

Bitmap bmpIcon = icon.ToBitmap(); 

using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) 
{ 
    bmpIcon.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);   
    return ms.ToArray(); 
} 
+1

No, no llame a 'GetBuffer', que bien puede tener 0s extraños al final. 'ToArray' es la llamada correcta para usar. –

+0

Gracias, señaló. Realmente solo copié cosas del enlace. Hay múltiples soluciones en eso. 20 segundos en Google :) –

1

... Y de nuevo

public static Icon IconFromBytes(byte[] bytes) { 
    using(var ms = new MemoryStream(bytes)) { 
      return new Icon(ms); 
    } 
} 

La clase lee Icono de la corriente tan pronto como sea construido. Ningún daño al cerrar MS.

+0

+1 para usar 'using' :) – Abel

+1

-1 por no entender lo que hace Dispose(). –

+0

¿Cuidar para elaborar? Estoy de acuerdo en que MemoryStream no necesita una eliminación porque no tiene recursos no administrados ... pero refuerza la idea de realizar una llamada cuando se implementa IDisposable. –

Cuestiones relacionadas