La forma más rápida de convertir la matriz de Imagen a Byte

Estoy haciendo la aplicación de uso compartido de escritorio remoto en la que capturo una imagen del escritorio y la comprime y la envío al receptor. Para comprimir la imagen, necesito convertirla a un byte [].

Actualmente estoy usando 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; } 

Pero no me gusta porque tengo que guardarlo en un ImageFormat y eso también puede agotar los recursos (Slow Down) y producir diferentes resultados de compresión. He leído cómo usar Marshal.Copy y memcpy pero no puedo entiéndelos.

Entonces, ¿hay algún otro método para lograr este objective?

Entonces, ¿hay algún otro método para lograr este objective?

No. Para convertir una imagen a una matriz de bytes, debe especificar un formato de imagen, del mismo modo que debe especificar una encoding cuando convierta texto en una matriz de bytes.

Si le preocupan los artefactos de compresión, elija un formato sin pérdida. Si le preocupan los recursos de la CPU, elija un formato que no moleste en la compresión, por ejemplo, solo los píxeles RAW brutos. Pero, por supuesto, eso conducirá a una matriz de bytes más grande.

Tenga en cuenta que si elige un formato que no incluya compresión, no tiene sentido entonces comprimir la matriz de bytes después; es casi seguro que no tendrá ningún efecto beneficioso.

Hay una propiedad RawFormat del parámetro Image que devuelve el formato de archivo de la imagen. Puede intentar lo siguiente:

 // extension method public static byte[] imageToByteArray(this System.Drawing.Image image) { using(var ms = new MemoryStream()) { image.Save(ms, image.RawFormat); return ms.ToArray(); } } 

No estoy seguro de si obtendrás grandes ganancias por las razones que Jon Skeet señaló. Sin embargo, puede probar y comparar el método TypeConvert.ConvertTo y ver cómo se compara con el uso de su método actual.

 ImageConverter converter = new ImageConverter(); byte[] imgArray = (byte[])converter.ConvertTo(imageIn, typeof(byte[])); 
 public static byte[] ReadImageFile(string imageLocation) { byte[] imageData = null; FileInfo fileInfo = new FileInfo(imageLocation); long imageFileLength = fileInfo.Length; FileStream fs = new FileStream(imageLocation, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); imageData = br.ReadBytes((int)imageFileLength); return imageData; } 
 public static class HelperExtensions { //Convert Image to byte[] array: public static byte[] ToByteArray(this Image imageIn) { var ms = new MemoryStream(); imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png); return ms.ToArray(); } //Convert byte[] array to Image: public static Image ToImage(this byte[] byteArrayIn) { var ms = new MemoryStream(byteArrayIn); var returnImage = Image.FromStream(ms); return returnImage; } } 

La manera más rápida que pude averiguar es esta:

 var myArray = (byte[]) new ImageConverter().ConvertTo(InputImg, typeof(byte[])); 

Espero ser útil