2009-03-10 36 views
26

¿Por qué aparece la excepción "Parámetro no válido" en mi código:carga excepción "Parámetro no válido" System.Drawing.Image

MemoryStream ms = new MemoryStream(byteArrayIn); 
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms); 

La longitud de byteArrayIn es 169014. estoy recibiendo esta excepción a pesar el hecho de que ningún valor en él es mayor que 255.

+1

por favor formato su pregunta correctamente –

+0

'ninguno de los valores en él no es mayor que 255' se expresa incorrectamente, es doble negativo, por lo que es positivo. Entonces dices que todos los valores están por encima de 255. Supongo que querías decir que son todos menos o iguales a 255, que es una barrera intrínseca de un byte. –

Respuesta

3

¿Qué línea arroja la excepción? ¿El new MemoryStream(...)? o el Image.FromStream(...)? ¿Y cuál es el 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 realmente contiene una imagen en un formato sensible?

Por ejemplo, el siguiente (aunque no es un gran 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); 
13

Mi conjetura es que byteArrayIn no contiene datos de imagen válidos.

Por favor, dar más información sin embargo:

  • Qué línea de código es una excepción?
  • ¿Cuál es el mensaje?
  • ¿De dónde sacaste byteArrayIn y estás seguro de que debe contener una imagen válida?
+1

Gracias Jon, esta respuesta me permitió encontrar una solución a mi parámetro no es una excepción válida. +1 para usted – Sebastian

+0

De hecho, me parece que "El parámetro no es válido" en ese caso casi siempre indica datos corruptos/inválidos – Yandros

17

Tuve el mismo problema y aparentemente ahora se resuelve, a pesar de esto y algunas otras excepciones gdi + son muy engañosas, encontré que el problema era que el parámetro enviado 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 archivo se construyó desde el archivo descargado desde el 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 que ayude!

1

La excepción "parámetro no es válido" lanzada por Image.FromStream() indica que la transmisión 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); 

Ejemplo 2 funcionará, tenga en cuenta que useEmbeddedColorManagement debe ser falsa para validateImageData sea válida.

Puede ser más fácil depurar volcando la secuencia de memoria a un archivo e inspeccionando el contenido.

1

Este error se debe a la inserción de datos binarios en un búfer. Para resolver este problema, debe insertar una instrucció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; 
-2

todas las soluciones dadas no funciona .. no haga concentrarse sólo 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 fallo ..:

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 con éxito inserta ... pero podía comprender su guardar la imagen en forma de tipo de datos equivocado .. mientras que el tipo de datos debe BT "imagen" .. y por eso 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% gurantee que no habrá nO VÁLIDA parámetro de error en la recuperación .... SOLUCIONADO !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!

-3

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:

INSERT INTO [TableX] (ImgColumn) VALUES (
(SELECT * FROM OPENROWSET(BULK N'C:\....\Picture 010.png', SINGLE_BLOB) as tempimg)) 

La mayoría de la gente lo hace de forma incorrecta esta manera:

INSERT INTO [TableX] (ImgColumn) VALUES ('C:\....\Picture 010.png')) 
4
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); 
+0

Esta es la única solución de trabajo en mi caso, ¡gracias! Tengo pocos tipos de imágenes para cargar y algunas de ellas no pueden cargarse con Image.FromStream(). ImageConverter puede cargarlos todos :) –

+0

Mismo error "Parámetro no válido" – dalvir

-3

solo sigue este 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(); 
Cuestiones relacionadas