¿Alguien puede sugerir cómo puedo convertir una imagen en una matriz de bytes ... y viceversa? Si alguien tiene algunos ejemplos de código, ayúdenme. Estoy desarrollando una aplicación WPF y habilito para encontrar el lector de flujo.Cómo convertir imágenes en matriz de bytes
Respuesta
código de ejemplo para cambiar una imagen en una matriz de bytes
public byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
using (var ms = new MemoryStream())
{
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
}
C# Image to Byte Array and Byte Array to Image Converter Class
¿Sólo desea que los píxeles o toda la imagen (incluyendo las cabeceras) como una matriz de bytes? Para los píxeles: utilice el método CopyPixels
en Bitmap Algo así como:
var bitmap = new BitmapImage(uri);
//Pixel array
byte[] pixels = new byte[width * height * 4]; //account for stride if necessary and whether the image is 32 bit, 16 bit etc.
bitmap.CopyPixels(..size, pixels, fullStride, 0);
intente 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;
}
imageToByteArray (System.Drawing.Image imageIn) imageIn es la ruta de la imagen u otra cosa, como podemos pasar la imagen en este – Shashank
Esto es lo que hago cada vez que necesito convertir una imagen a una matriz de bytes o volver. –
Se olvidó de cerrar el flujo de memoria ... btw esto se copia directamente desde: [link] (http://www.codeproject.com/KB/recipes/ImageConverter.aspx) – Qwerty01
Puede utilizar File.ReadAllBytes()
método para leer cualquier archivo en el conjunto de bytes. Para escribir una matriz de bytes en un archivo, simplemente use el método File.WriteAllBytes()
.
Espero que esto ayude.
Puede encontrar más información y código de muestra here.
Otra forma de obtener matriz de bytes de ruta de la imagen es
byte[] imgdata = System.IO.File.ReadAllBytes(HttpContext.Current.Server.MapPath(path));
Aquí es lo que estoy usando actualmente. Algunas de las otras técnicas que he probado han sido no ó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 para el conjunto 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 de archivo:
/// <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 mapa de bits que quiere que su flujo de origen se mantenga abierto, y algunas soluciones alternativas sugeridas para ese problema que hacen que el archivo de origen se mantenga bloqueado.
Durante la prueba de esto tomaría el mapa de bits resultante y lo convertiría en una matriz de bytes usando: 'ImageConverter _imageConverter = new ImageConverter(); bloqueo (SourceImage) { return (byte []) _ imageConverter.ConvertTo (SourceImage, typeof (byte [])); } 'Donde resultaría intermitentemente en arreglos de 2 tamaños diferentes. Esto normalmente ocurriría después de aproximadamente 100 iteraciones, pero cuando obtengo el mapa de bits usando 'nuevo Bitmap (SourceFileName);' y luego lo ejecuto a través de ese código, funciona bien. – Don
@Don: Realmente no tengo buenas ideas. ¿Es consistente qué imágenes no producen el mismo resultado que la entrada? ¿Has intentado examinar el resultado cuando no es el esperado para ver por qué es diferente? O tal vez realmente no importa, y uno puede simplemente aceptar que "las cosas suceden". – RenniePet
Sucedió constantemente. Sin embargo, nunca encontré la causa. Tengo la sensación de que podría haber tenido algo que ver con un límite de byte de 4 KB en la asignación de memoria. Pero eso podría estar equivocado. Cambié a usar un MemoryStream con un BinaryFormatter y pude volverme muy consistente al probarlo con más de 250 imágenes de prueba diferentes de distintos formatos y tamaños, en bucle de más de 1000 veces para su verificación. Gracias por la respuesta. – Don
en la conversión de un objeto en la imagen para byte[]
se puede hacer de la siguiente manera:
public static byte[] converterDemo(Image x)
{
ImageConverter _imageConverter = new ImageConverter();
byte[] xByte = (byte[])_imageConverter.ConvertTo(x, typeof(byte[]));
return xByte;
}
¡Respuesta perfecta! .... no hay necesidad de definir la "extensión de archivo de imagen", exactamente lo que estaba buscando. – Bravo
Este código recupera primeras 100 filas de la tabla en SQLSERVER 2012 y guarda una imagen por fila como un archivo en el disco local
public void SavePicture()
{
SqlConnection con = new SqlConnection("Data Source=localhost;Integrated security=true;database=databasename");
SqlDataAdapter da = new SqlDataAdapter("select top 100 [Name] ,[Picture] From tablename", con);
SqlCommandBuilder MyCB = new SqlCommandBuilder(da);
DataSet ds = new DataSet("tablename");
byte[] MyData = new byte[0];
da.Fill(ds, "tablename");
DataTable table = ds.Tables["tablename"];
for (int i = 0; i < table.Rows.Count;i++)
{
DataRow myRow;
myRow = ds.Tables["tablename"].Rows[i];
MyData = (byte[])myRow["Picture"];
int ArraySize = new int();
ArraySize = MyData.GetUpperBound(0);
FileStream fs = new FileStream(@"C:\NewFolder\" + myRow["Name"].ToString() + ".jpg", FileMode.OpenOrCreate, FileAccess.Write);
fs.Write(MyData, 0, ArraySize);
fs.Close();
}
}
tenga en cuenta: Directorio con NewFolder nombre debe existir en C: \
Respondió la pregunta incorrecta ... Bueno, espero^_^ –
Código:
using System.IO;
byte[] img = File.ReadAllBytes(openFileDialog1.FileName);
Solo funciona si está leyendo un archivo (y aun así obtiene los bytes formateados/comprimidos, no los crudos a menos que sea un BMP) – BradleyDotNET
Si no se hace referencia a los imageBytes para llevar bytes de la corriente, el método no devuelve nada. Asegúrese de hacer referencia a imageBytes = m.ToArray();
public static byte[] SerializeImage() {
MemoryStream m;
string PicPath = pathToImage";
byte[] imageBytes;
using (Image image = Image.FromFile(PicPath)) {
using (m = new MemoryStream()) {
image.Save(m, image.RawFormat);
imageBytes = new byte[m.Length];
//Very Important
imageBytes = m.ToArray();
}//end using
}//end using
return imageBytes;
}//SerializeImage
- 1. cómo convertir imágenes en matriz de bytes en java?
- 2. Cómo convertir una matriz de bytes en una matriz int?
- 3. Convertir matriz de bytes en Bitset
- 4. ¿Cómo convertir una matriz de bytes a una matriz int?
- 5. Convertir matriz de bytes a matriz corta en C#
- 6. ¿Cómo convertir una matriz de bytes en doble en C?
- 7. Cómo convertir un entero a matriz de bytes en php
- 8. ¿Cómo convertir NSData a matriz de bytes en iPhone?
- 9. Convertir estructura en bytes
- 10. Convertir matriz de bytes a archivo wav
- 11. Python: convertir cadena a matriz de bytes
- 12. Convertir una matriz de cadenas a matriz de bytes
- 13. ¿Convertir matriz de bytes a matriz de bits?
- 14. cómo convertir la matriz de bytes en una matriz de enteros
- 15. convertir matriz de cadena a matriz de bytes
- 16. Convertir una matriz de bytes a una clase que contiene una matriz de bytes en C#
- 17. Cómo convertir una matriz de bytes al adjunto de correo
- 18. convertir mapa de bits en matriz de bytes
- 19. Convertir imágenes de Java a tamaño de matriz de bytes, problemas
- 20. Cómo convertir una matriz de bytes a Bitmap
- 21. Cómo convertir eficientemente la matriz de bytes a la cadena
- 22. cómo convertir una matriz de bytes a Stream
- 23. ¿Cómo convertir una matriz de bytes int a little endian?
- 24. Convertir cadena de Java en matriz de bytes
- 25. Cómo convertir una matriz de bytes a blob
- 26. Leer línea de matriz de bytes (no convertir matriz de bytes a cadena)
- 27. Cómo convertir una matriz de bytes a NSString
- 28. C#: Convertir matriz de bytes en un flotador
- 29. ¿Convertir una matriz de bytes a cadena en Silverlight?
- 30. Convertir objeto a matriz de bytes en C#
en lugar de 'System.Drawing.Imaging.ImageFormat.Gif', se puede usar' imageIn.RawFormat' –
Esto no parece ser repetible, o al menos después de un par de veces de la conversión, extraña GDI + errores comienza a ocurrir La solución 'ImageConverter' que se encuentra a continuación parece evitar estos errores. –