Maneira mais rápida de converter matriz de imagem em byte

Eu estou fazendo aplicação de compartilhamento de área de trabalho remota em que eu capturar uma imagem da área de trabalho e comprimir e enviar para o receptor. Para comprimir a imagem, preciso convertê-la em um byte [].

Atualmente estou usando isso:

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

Mas eu não gosto porque eu tenho que salvá-lo em um ImageFormat e que também pode usar resources (Slow Down), bem como produzir resultados de compression diferentes. Eu li sobre o uso de Marshal.Copy e memcpy, mas eu sou incapaz de compreendê-los.

Então, há algum outro método para atingir esse objective?

Então, há algum outro método para atingir esse objective?

Não. Para converter uma imagem em uma matriz de bytes, é necessário especificar um formato de imagem – assim como você precisa especificar uma codificação ao converter um texto em uma matriz de bytes.

Se você está preocupado com os artefatos de compression, escolha um formato sem perdas. Se você está preocupado com os resources da CPU, escolha um formato que não incomode a compactação – apenas pixels RAW brutos, por exemplo. Mas é claro que isso levará a uma matriz de bytes maior.

Observe que, se você escolher um formato que inclua compactação, não há sentido em compactar a matriz de bytes posteriormente – é quase certo que não haverá efeito benéfico.

Há uma propriedade RawFormat do parâmetro Image que retorna o formato de arquivo da imagem. Você pode tentar o seguinte:

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

Eu não tenho certeza se você vai obter ganhos enormes por razões que Jon Skeet apontou. No entanto, você poderia tentar e comparar o método TypeConvert.ConvertTo e ver como ele se compara ao uso do método atual.

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

A maneira mais rápida que eu poderia descobrir é esta:

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

Espero ser útil