Quiero convertir una matriz de bytes en una imagen.
Este es el código de mi base de datos de donde obtengo la matriz de bytes:
public void Get_Finger_print()
{
try
{
using (SqlConnection thisConnection = new SqlConnection(@"Data Source=" + System.Environment.MachineName + "\\SQLEXPRESS;Initial Catalog=Image_Scanning;Integrated Security=SSPI "))
{
thisConnection.Open();
string query = "select pic from Image_tbl";// where Name='" + name + "'";
SqlCommand cmd = new SqlCommand(query, thisConnection);
byte[] image =(byte[]) cmd.ExecuteScalar();
Image newImage = byteArrayToImage(image);
Picture.Image = newImage;
//return image;
}
}
catch (Exception) { }
//return null;
}
Mi código de conversión:
public Image byteArrayToImage(byte[] byteArrayIn)
{
try
{
MemoryStream ms = new MemoryStream(byteArrayIn,0,byteArrayIn.Length);
ms.Write(byteArrayIn, 0, byteArrayIn.Length);
returnImage = Image.FromStream(ms,true);//Exception occurs here
}
catch { }
return returnImage;
}
Cuando llego a la línea con un comentario, ocurre la siguiente excepción: Parameter is not valid.
¿Cómo puedo solucionar lo que esté causando esta excepción?
c#
arrays
byte
bytebuffer
Tanzeel ur Rahman
fuente
fuente
Respuestas:
Está escribiendo en su flujo de memoria dos veces, y tampoco está desechando el flujo después de su uso. También le solicita al decodificador de imágenes que aplique la corrección de color incorporada.
Prueba esto en su lugar:
fuente
Tal vez me esté perdiendo algo, pero para mí este de una sola línea funciona bien con una matriz de bytes que contiene una imagen de un archivo JPEG.
EDITAR:
Consulte aquí para obtener una versión actualizada de esta respuesta: Cómo convertir una imagen en una matriz de bytes
fuente
fuente
Me gustaría señalar que hay un error en la solución proporcionada por @ isaias-b.
Esa solución supone que
stride
es igual a la longitud de la fila. Pero no siempre es cierto. Debido a las alineaciones de memoria realizadas por GDI, el paso puede ser mayor que la longitud de la fila. Esto debe tenerse en cuenta. De lo contrario, se generará una imagen desplazada no válida. Se ignorarán los bytes de relleno en cada fila.Código fijo:
Para ilustrar a qué puede conducir, generemos una
PixelFormat.Format24bppRgb
imagen de degradado de 101x101:Si copiamos la matriz completa como está en la dirección señalada
bmpData.Scan0
, obtendremos la siguiente imagen. Cambio de imagen porque parte de la imagen se escribió en bytes de relleno, eso se ignoró. También es por eso que la última fila está incompleta:Pero si copiamos el puntero de destino de cambio fila por fila por
bmpData.Stride
valor, se generarán imágenes válidas:Stride también puede ser negativo:
Pero no trabajé con tales imágenes y esto está más allá de mi nota.
Respuesta relacionada: C #: búfer RGB de mapa de bits diferente de C ++
fuente
Todas las respuestas presentadas asumen que la matriz de bytes contiene datos en una representación de formato de archivo conocido, como: gif, png o jpg. Pero recientemente tuve un problema al intentar convertir
byte[]
correos electrónicos, que contienen información BGRA linealizada, de manera eficiente enImage
objetos. El siguiente código lo resuelve usando unBitmap
objeto.Esta es una pequeña variación de una solución que se publicó en este sitio .
fuente
hay un enfoque simple como el siguiente, puede usar el
FromStream
método de una imagen para hacer el truco, solo recuerde usarloSystem.Drawing
;fuente
probar (ACTUALIZAR)
fuente
No ha declarado returnImage como ningún tipo de variable :)
Esto debería ayudar:
fuente
Esto está inspirado en la respuesta de Holstebroe, más los comentarios aquí: Obtener un objeto Imagen de una matriz de bytes
fuente
Un trazador de líneas:
fuente
La mayoría de las veces, cuando esto sucede, son datos incorrectos en la columna SQL. Esta es la forma correcta de insertar en una columna de imagen:
La mayoría de la gente lo hace incorrectamente de esta manera:
fuente
[SixLabors.ImageSharp] [1] [1]: https://www.nuget.org/packages/SixLabors.ImageSharp
fuente