2009-03-10 24 views
26

Perché mi appare l'eccezione "parametro non valido" nel mio codice:"parametro non valido" eccezione carico System.Drawing.Image

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

La lunghezza del byteArrayIn è 169014. sto ottenendo questa eccezione, nonostante il fatto che nessun valore in esso è maggiore di 255.

+1

per favore formattare la tua domanda correttamente –

+0

'nessun valore in esso non è maggiore di 255' è errato, il suo doppio negativo, rendendolo positivo. Quindi tu dici che tutti i valori sono superiori a 255. Immagino tu intenda che sono tutti inferiori o uguali a 255, che è una barriera intrinseca di un byte. –

risposta

3

Quale riga lancia l'eccezione? Lo new MemoryStream(...)? o lo Image.FromStream(...)? E qual è il byteArrayIn? È un byte[]? Chiedo solo per il commento "E nessuno di valore in esso non è superiore a 255" - che naturalmente è automatico per un byte[].

Come una domanda più ovvia: il file binario contiene effettivamente un'immagine in un formato ragionevole?

Ad esempio, il seguente (anche se non grande codice) funziona bene:

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

mia ipotesi è che byteArrayIn non contiene dati di immagine validi.

Si prega di fornire ulteriori informazioni se:

  • Quale linea di codice è un'eccezione?
  • Qual è il messaggio?
  • Da dove hai preso byteArrayIn da e sei sicuro che dovrebbe contenere un'immagine valida?
+1

Grazie Jon, questa risposta mi ha permesso di trovare una soluzione al mio Parametro non è un'eccezione valida. +1 per te – Sebastian

+0

In effetti, trovo che "Parameter is not valid" in quel caso indica quasi sempre dati corrotti/non validi – Yandros

17

Ho avuto lo stesso problema e apparentemente è risolto ora, nonostante questo e qualche altro GDI + eccezioni sono molto fuorviante, ho scoperto che in realtà il problema era che il parametro viene inviato a un costruttore Bitmap non era valido. Ho questo codice:

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 seguente riga stava causando un errore:

Bitmap bitmap = (Bitmap)Image.FromStream(fs, true, false) 

Il flusso di file è stato costruito dal file scaricato dal Map Server. La mia app stava inviando la richiesta in modo errato per ottenere l'immagine, e il server stava restituendo qualcosa con l'estensione jpg, ma in realtà era un html che mi diceva che si era verificato un errore. Quindi stavo prendendo quell'immagine e provando a costruire una Bitmap con essa. La correzione era di controllare/convalidare l'immagine per un'immagine jpeg valida.

Spero che aiuti!

1

L'eccezione "parametro non valido" generata da Image.FromStream() indica che lo stream non è un formato "valido" o "riconosciuto". Guarda i flussi di memoria, specialmente se stai prendendo varie correzioni di byte da un file.

// 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); 

Esempio 2 funzionerà, notare che useEmbeddedColorManagement deve essere falsa per validateImageData sia valida.

Può essere più semplice eseguire il debug scaricando il flusso di memoria su un file e controllando il contenuto.

1

Questo errore è causato dall'inserimento di dati binari in un buffer. Per risolvere questo problema, è necessario inserire una dichiarazione nel codice.

Questa affermazione è:

obj_FileStream.Read(Img, 0, Convert.ToInt32(obj_FileStream.Length)); 

Esempio:

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

tutte le soluzioni presentate non funziona .. dont concentrarsi solo sulla parte recupero. luk all'inserimento dell'immagine. ho fatto lo stesso errore Tiro un'immagine dal disco rigido e l'ho salvata nel database. Il problema sta nel comando insert. luk al mio codice di errore ..:

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(); 
    } 

Il codice sopra mostra con successo inserita ... ma actualy sua salvare l'immagine sotto forma di tipo di dati sbagliato .. considerando che il tipo di dati deve BT "immagine" .. così ho migliorato il codice ..

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 che non ci sarà alcun nON PARAMETRO errore valido nel recupero .... RISOLTO !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!

-3

La maggior parte delle volte in cui ciò accade, si tratta di dati non validi nella colonna SQL. Questo è il modo corretto di inserire in una colonna di immagine:

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

La maggior parte delle persone lo fanno in modo non corretto in questo modo:

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

Questa è l'unica soluzione funzionante nel mio caso, grazie! Ho alcuni tipi di immagini da caricare e alcuni di essi non possono essere caricati da Image.FromStream(). ImageConverter può caricarli tutti :) –

+0

Stesso errore "Parametro non valido" – dalvir

-3

basta seguire questo per inserire i valori nel database

// Stringa di connessione

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(); 
Problemi correlati