Cómo convertir una imagen a una matriz de bytes [duplicado]

Resuelto Shashank asked hace 14 años • 12 respuestas

¿Alguien puede sugerir cómo puedo convertir una imagen en una matriz de bytes y viceversa?

Estoy desarrollando una aplicación WPF y usando un lector de secuencias.

Shashank avatar Sep 27 '10 12:09 Shashank
Aceptado

Código de muestra para cambiar una imagen a una matriz de bytes

public byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
   using (var ms = new MemoryStream())
   {
      imageIn.Save(ms,imageIn.RawFormat);
      return  ms.ToArray();
   }
}

Clase de conversión de imagen a matriz de bytes y matriz de bytes a imagen de C#

Pranay Rana avatar Sep 27 '2010 05:09 Pranay Rana

Para convertir un objeto de imagen, byte[]puede hacer lo siguiente:

public static byte[] converterDemo(Image x)
{
    ImageConverter _imageConverter = new ImageConverter();
    byte[] xByte = (byte[])_imageConverter.ConvertTo(x, typeof(byte[]));
    return xByte;
}
AR5HAM avatar Jun 06 '2013 09:06 AR5HAM

Otra forma de obtener una matriz de bytes a partir de la ruta de la imagen es

byte[] imgdata = System.IO.File.ReadAllBytes(HttpContext.Current.Server.MapPath(path));
Neelam avatar May 11 '2012 05:05 Neelam

Esto es lo que estoy usando actualmente. Algunas de las otras técnicas que probé no fueron óptimas porque cambiaron la profundidad de bits de los píxeles (24 bits frente a 32 bits) o ignoraron la resolución de la imagen (ppp).

  // ImageConverter object used to convert byte arrays containing JPEG or PNG file images into 
  //  Bitmap objects. This is static and only gets instantiated once.
  private static readonly ImageConverter _imageConverter = new ImageConverter();

Imagen a matriz de bytes:

  /// <summary>
  /// Method to "convert" an Image object into a byte array, formatted in PNG file format, which 
  /// provides lossless compression. This can be used together with the GetImageFromByteArray() 
  /// method to provide a kind of serialization / deserialization. 
  /// </summary>
  /// <param name="theImage">Image object, must be convertable to PNG format</param>
  /// <returns>byte array image of a PNG file containing the image</returns>
  public static byte[] CopyImageToByteArray(Image theImage)
  {
     using (MemoryStream memoryStream = new MemoryStream())
     {
        theImage.Save(memoryStream, ImageFormat.Png);
        return memoryStream.ToArray();
     }
  }

Matriz de bytes a imagen:

  /// <summary>
  /// Method that uses the ImageConverter object in .Net Framework to convert a byte array, 
  /// presumably containing a JPEG or PNG file image, into a Bitmap object, which can also be 
  /// used as an Image object.
  /// </summary>
  /// <param name="byteArray">byte array containing JPEG or PNG file image or similar</param>
  /// <returns>Bitmap object if it works, else exception is thrown</returns>
  public static Bitmap GetImageFromByteArray(byte[] byteArray)
  {
     Bitmap bm = (Bitmap)_imageConverter.ConvertFrom(byteArray);

     if (bm != null && (bm.HorizontalResolution != (int)bm.HorizontalResolution ||
                        bm.VerticalResolution != (int)bm.VerticalResolution))
     {
        // Correct a strange glitch that has been observed in the test program when converting 
        //  from a PNG file image created by CopyImageToByteArray() - the dpi value "drifts" 
        //  slightly away from the nominal integer value
        bm.SetResolution((int)(bm.HorizontalResolution + 0.5f), 
                         (int)(bm.VerticalResolution + 0.5f));
     }

     return bm;
  }

Editar: para obtener la imagen de un archivo jpg o png, debe leer el archivo en una matriz de bytes usando File.ReadAllBytes():

 Bitmap newBitmap = GetImageFromByteArray(File.ReadAllBytes(fileName));

Esto evita problemas relacionados con el hecho de que Bitmap desee que su flujo fuente se mantenga abierto, y algunas soluciones sugeridas para ese problema que resultan en que el archivo fuente se mantenga bloqueado.

RenniePet avatar May 15 '2013 23:05 RenniePet

prueba esto:

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
    return ms.ToArray();
}

public Image byteArrayToImage(byte[] byteArrayIn)
{
    MemoryStream ms = new MemoryStream(byteArrayIn);
    Image returnImage = Image.FromStream(ms);
    return returnImage;
}
anishMarokey avatar Sep 27 '2010 05:09 anishMarokey