Estoy creando una aplicación para compartir escritorio remoto en la que capturo una imagen del escritorio, la comprimo y la envío al receptor. Para comprimir la imagen necesito convertirla en 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 consumir recursos (ralentizar) y producir diferentes resultados de compresión. He leído sobre el uso de Marshal.Copy y memcpy pero no puedo entiéndelos.
Entonces, ¿hay algún otro método para lograr este objetivo?
MemoryStream
; es un recurso completamente administrado, a menos que lo esté usando de forma remota. En ambos casos, sería inapropiado deshacerse del recurso.Respuestas:
No. Para convertir una imagen a una matriz de bytes que tiene que especificar un formato de imagen - al igual que usted tiene que especificar una codificación al convertir texto a una matriz de bytes.
Si le preocupan los artefactos de compresión, elija un formato sin pérdidas. Si le preocupan los recursos de la CPU, elija un formato que no se moleste en comprimir, solo píxeles ARGB sin procesar, por ejemplo. Pero, por supuesto, eso conducirá a una matriz de bytes más grande.
Tenga en cuenta que si tienes que elegir un formato que hace incluir compresión, no tiene sentido en que se moldea la matriz de bytes después - que es casi seguro que no tendrá ningún efecto beneficioso.
fuente
imageIn.RawFormat
qué intenta guardar los bytes de la imagen sin procesar sin volver a codificar.Hay una propiedad RawFormat del parámetro Image que devuelve el formato de archivo de la imagen. Puede intentar lo siguiente:
fuente
myObject.Dispose()
ousing(myObject){}
- ambos hacen lo mismo, pero la declaración de uso básicamente crea un alcance que se limpiará por usted.No estoy seguro de si obtendrá grandes ganancias por las razones que señaló Jon Skeet. 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.
fuente
fuente
fuente
La forma más rápida que pude averiguar es esta:
Espero ser útil
fuente
System.Windows.Controls.Image
objetos. Si desea convertir uno de esos en bytes y lo pasa a esta línea comoInputImg
, esto no funcionará. Espera unSystem.Drawing.Image
objeto.