Usando C #, ¿hay una mejor manera de convertir un Windows Bitmap
a un byte[]
archivo que guardar en un archivo temporal y leer el resultado usando un FileStream
?
233
Hay un par de maneras.
ImageConverter
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
Este es conveniente porque no requiere mucho código.
Flujo de memoria
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
Este es equivalente a lo que está haciendo, excepto que el archivo se guarda en la memoria en lugar de en el disco. Aunque tiene más código, tiene la opción de ImageFormat y puede modificarse fácilmente entre guardarlo en la memoria o en el disco.
ImageConverter
método guardará la imagen como Png, lo que dará como resultado archivos ENORMES.ImageConverter
no es el estándar .net que podrías usarMemoryStream
Un MemoryStream puede ser útil para esto. Podría ponerlo en un método de extensión:
Podrías usarlo como:
Estoy parcialmente en desacuerdo con la respuesta de prestomanifto con respecto al ImageConverter. No use ImageConverter. No hay nada técnicamente malo en ello, pero el simple hecho de que use boxing / unboxing from object me dice que es código de los viejos lugares oscuros del marco .NET y no es ideal para usar con el procesamiento de imágenes (es excesivo para convertir a un byte [] al menos), especialmente cuando considera lo siguiente.
Eché un vistazo al
ImageConverter
código utilizado por el marco .Net, e internamente usa un código casi idéntico al que proporcioné anteriormente. Crea uno nuevoMemoryStream
, guarda elBitmap
formato en el que estaba cuando lo proporcionó y devuelve la matriz. Omita la sobrecarga adicional de crear unaImageConverter
clase utilizandoMemoryStream
fuente
También puede simplemente Marshal. Copie los datos del mapa de bits. Sin memoria intermedia, etc. y una copia rápida de la memoria. Esto debería funcionar tanto en mapas de bits de 24 bits como de 32 bits.
.
fuente
Guarde la imagen en un MemoryStream y luego tome la matriz de bytes.
http://msdn.microsoft.com/en-us/library/ms142148.aspx
fuente
System.Drawing.Image
(ver: docs.microsoft.com/en-us/dotnet/api/… )System.Drawing.Image does not exist
. Entonces ... no, no funciona :(Use un en
MemoryStream
lugar de unFileStream
, así:fuente
ToArray
, noGetBuffer
.Note that the buffer contains allocated bytes which might be unused. For example, if the string "test" is written into the MemoryStream object, the length of the buffer returned from GetBuffer is 256, not 4, with 252 bytes unused. To obtain only the data in the buffer, use the ToArray method.
ahora la matriz de bytes deGetBuffer
devolverá la imagen más los bytes no utilizados, lo que probablemente dará como resultado una imagen corrupta.Intenta lo siguiente:
Asegúrate de estar usando:
fuente
Creo que simplemente puedes hacer:
fuente
fuente
Más simple:
fuente
Muy simple usar esto solo en una línea:
fuente