c# - parametro - La excepción "Parámetro no válido" carga System.Drawing.Image
el parametro no es valido en system drawing image fromstream (9)
¿Por qué recibo la excepción "Parámetro no válido" en mi código?
MemoryStream ms = new MemoryStream(byteArrayIn);
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);
La longitud de byteArrayIn
es 169014. Obtengo esta excepción a pesar de que ningún valor en ella es mayor que 255.
¿Qué línea está arrojando la excepción? El new MemoryStream(...)
? o el Image.FromStream(...)
? ¿Y qué es byteArrayIn
? ¿Es un byte[]
? Solo pregunto por el comentario "Y nada de valor en él no es mayor que 255" - que por supuesto es automático para un byte[]
.
Como una pregunta más obvia: ¿el binario en realidad contiene una imagen en un formato sensible?
Por ejemplo, el siguiente (aunque no excelente código) funciona bien:
byte[] data = File.ReadAllBytes(@"d:/extn.png"); // not a good idea...
MemoryStream ms = new MemoryStream(data);
Image img = Image.FromStream(ms);
Console.WriteLine(img.Width);
Console.WriteLine(img.Height);
Este error es causado por la inserción de datos binarios en un buffer. Para resolver este problema, debe insertar una declaración en su código.
Esta declaración es:
obj_FileStream.Read(Img, 0, Convert.ToInt32(obj_FileStream.Length));
Ejemplo:
FileStream obj_FileStream = new FileStream(str_ImagePath, FileMode.OpenOrCreate, FileAccess.Read);
Byte[] Img = new Byte[obj_FileStream.Length];
obj_FileStream.Read(Img, 0, Convert.ToInt32(obj_FileStream.Length));
dt_NewsFeedByRow.Rows[0][6] = Img;
La excepción "parámetro no es válido" lanzada por Image.FromStream()
le dice que la secuencia no es un formato "válido" o "reconocido". Mire las secuencias de memoria, especialmente si está tomando varias compensaciones de bytes de un archivo.
// 1. Create a junk memory stream, pass it to Image.FromStream and
// get the "parameter is not valid":
MemoryStream ms = new MemoryStream(new Byte[] {0x00, 0x01, 0x02});
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);`
// 2. Create a junk memory stream, pass it to Image.FromStream
// without verification:
MemoryStream ms = new MemoryStream(new Byte[] {0x00, 0x01, 0x02});
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms, false, true);
El ejemplo 2 funcionará, tenga en cuenta que useEmbeddedColorManagement debe ser falso para que validateImageData sea válido.
Puede ser más fácil depurar arrojando la secuencia de memoria a un archivo e inspeccionando el contenido.
La mayoría de las veces, cuando sucede esto, son datos incorrectos en la columna SQL. Esta es la forma correcta de insertar en una columna de imagen:
INSERT INTO [TableX] (ImgColumn) VALUES (
(SELECT * FROM OPENROWSET(BULK N''C:/..../Picture 010.png'', SINGLE_BLOB) as tempimg))
La mayoría de las personas lo hacen incorrectamente de esta manera:
INSERT INTO [TableX] (ImgColumn) VALUES (''C:/..../Picture 010.png''))
Mi suposición es que byteArrayIn
no contiene datos de imagen válidos.
Por favor, da más información:
- ¿Qué línea de código está arrojando una excepción?
- ¿Cuál es el mensaje?
- ¿De dónde
byteArrayIn
y estás seguro de que debe contener una imagen válida?
Solo sigue esto para insertar valores en la base de datos
//Cadena de conexión
con.Open();
sqlQuery = "INSERT INTO [dbo].[Client] ([Client_ID],[Client_Name],[Phone],[Address],[Image]) VALUES(''" + txtClientID.Text + "'',''" + txtClientName.Text + "'',''" + txtPhoneno.Text + "'',''" + txtaddress.Text + "'',@image)";
cmd = new SqlCommand(sqlQuery, con);
cmd.Parameters.Add("@image", SqlDbType.Image);
cmd.Parameters["@image"].Value = img;
//img is a byte object
** /*MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms,pictureBox1.Image.RawFormat);
byte[] img = ms.ToArray();*/**
cmd.ExecuteNonQuery();
con.Close();
Tuve el mismo problema y aparentemente ahora está resuelto, a pesar de esto y algunas otras excepciones de gdi + son muy engañosas, descubrí que en realidad el problema era que el parámetro que se enviaba a un constructor de mapa de bits no era válido. Tengo este código:
using (System.IO.FileStream fs = new System.IO.FileStream(inputImage, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite))
{
try
{
using (Bitmap bitmap = (Bitmap)Image.FromStream(fs, true, false))
{
try
{
bitmap.Save(OutputImage + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
GC.Collect();
}
catch (Exception ex)
{
throw ex;
}
}
}
catch (ArgumentException aex)
{
throw new Exception("The file received from the Map Server is not a valid jpeg image", aex);
}
}
La siguiente línea estaba causando un error:
Bitmap bitmap = (Bitmap)Image.FromStream(fs, true, false)
La secuencia de archivos se creó a partir del archivo descargado del servidor de mapas. Mi aplicación estaba enviando la solicitud de forma incorrecta para obtener la imagen, y el servidor estaba devolviendo algo con la extensión jpg, pero en realidad era un html que me decía que había ocurrido un error. Así que estaba tomando esa imagen y tratando de construir un mapa de bits con ella. La solución era controlar / validar la imagen para una imagen jpeg válida.
¡Espero eso ayude!
todas las soluciones dadas no funcionan ... no te concentres solo en la parte de recuperación. luk en la inserción de la imagen. Hice el mismo error. Copie una imagen del disco duro y la guardé en la base de datos. El problema radica en el comando de inserción. luk en mi código de falla ..:
public bool convertImage()
{
try
{
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, ImageFormat.Jpeg);
photo = new byte[ms.Length];
ms.Position = 0;
ms.Read(photo, 0, photo.Length);
return true;
}
catch
{
MessageBox.Show("image can not be converted");
return false;
}
}
public void insertImage()
{
// SqlConnection con = new SqlConnection();
try
{
cs.Close();
cs.Open();
da.UpdateCommand = new SqlCommand("UPDATE All_students SET disco = " +photo+" WHERE Reg_no = ''" + Convert.ToString(textBox1.Text)+ "''", cs);
da.UpdateCommand.ExecuteNonQuery();
cs.Close();
cs.Open();
int i = da.UpdateCommand.ExecuteNonQuery();
if (i > 0)
{
MessageBox.Show("Successfully Inserted...");
}
}
catch
{
MessageBox.Show("Error in Connection");
}
cs.Close();
}
El código anterior muestra correctamente insertado ... pero en realidad está guardando la imagen en forma de tipo de datos incorrecto ... mientras que el tipo de datos debe bt "imagen" ... así que mejoré el código ...
public bool convertImage()
{
try
{
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, ImageFormat.Jpeg);
photo = new byte[ms.Length];
ms.Position = 0;
ms.Read(photo, 0, photo.Length);
return true;
}
catch
{
MessageBox.Show("image can not be converted");
return false;
}
}
public void insertImage()
{
// SqlConnection con = new SqlConnection();
try
{
cs.Close();
cs.Open();
//THIS WHERE THE CODE MUST BE CHANGED>>>>>>>>>>>>>>
da.UpdateCommand = new SqlCommand("UPDATE All_students SET disco = @img WHERE Reg_no = ''" + Convert.ToString(textBox1.Text)+ "''", cs);
da.UpdateCommand.Parameters.Add("@img", SqlDbType.Image);//CHANGED TO IMAGE DATATYPE...
da.UpdateCommand.Parameters["@img"].Value = photo;
da.UpdateCommand.ExecuteNonQuery();
cs.Close();
cs.Open();
int i = da.UpdateCommand.ExecuteNonQuery();
if (i > 0)
{
MessageBox.Show("Successfully Inserted...");
}
}
catch
{
MessageBox.Show("Error in Connection");
}
cs.Close();
}
100% de garantía de que no habrá error de PARÁMETRO NO VÁLIDO en la recuperación ... RESUELTO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!
byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}
ImageConverter imageConverter = new System.Drawing.ImageConverter();
System.Drawing.Image image = imageConverter.ConvertFrom(fileData) as System.Drawing.Image;
image.Save(imageFullPath, System.Drawing.Imaging.ImageFormat.Jpeg);