2009-03-10 14 views
26

Почему я получаю исключение «Параметр не действует» в моем коде:«Параметр не действует» закачать исключение System.Drawing.Image

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

Длина byteArrayIn является 169014. Я получаю это исключение, несмотря на тот факт, что в нем нет значения 255.

+1

формуйте пожалуйста ваш вопрос правильно –

+0

'ничто в нем не больше 255' неправильно сформулировано, его двойной отрицательный, что делает его положительным. Итак, вы говорите, что все значения выше 255. Полагаю, вы имели в виду, что они все меньше или равны 255, что является внутренним барьером байта. –

ответ

3

Какая линия выбрасывает исключение? new MemoryStream(...)? или Image.FromStream(...)? И что такое byteArrayIn? Это byte[]? Я только спрашиваю из-за комментария «И ни одна ценность в нем не больше 255» - это, конечно, автоматически для byte[].

Как более очевидный вопрос: действительно ли бинарный файл содержит изображение в разумном формате?

Например, следующее (хотя и не большой код) работает отлично:

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

Я думаю, что byteArrayIn не содержит действительные данные изображения.

Пожалуйста, дайте больше информации, хотя:

  • Какая строка кода бросает исключение?
  • Какое сообщение?
  • Откуда вы получили byteArrayIn, и вы уверены, что оно должно содержать допустимое изображение?
+1

Спасибо, Jon, этот ответ позволил мне найти решение моего параметра, это не допустимое исключение. +1 для вас – Sebastian

+0

Действительно, я обнаружил, что «Параметр недействителен» в этом случае почти всегда указывает на поврежденные/недействительные данные – Yandros

17

У меня была такая же проблема и, по-видимому, теперь решена, несмотря на это, а некоторые другие исключения gdi + очень вводят в заблуждение, я обнаружил, что на самом деле проблема заключалась в том, что параметр, отправляемый в конструктор Bitmap, недействителен. У меня есть этот код:

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

Следующая линия вызывает ошибку:

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

поток файл был построен из файла, загруженного из карт сервера. Мое приложение неправильно отправило запрос, чтобы получить изображение, и сервер возвращал что-то с расширением jpg, но на самом деле это html, сообщающий мне, что произошла ошибка. Поэтому я взял этот образ и попытался создать с ним растровое изображение. Исправление состоит в том, чтобы контролировать/проверять изображение для действительного изображения JPEG.

Надеюсь, это поможет!

1

Исключено, что параметр «недействителен», вызванный Image.FromStream(), указывает, что поток не является «допустимым» или «признанным». Наблюдайте за потоками памяти, особенно если вы берете различные смещения байтов из файла.

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

Пример 2 будет работать, обратите внимание, что useEmbeddedColorManagement должно быть ложным для validateImageData быть действительным.

Может быть проще всего отладить, сбросив поток памяти в файл и проверив содержимое.

1

Эта ошибка вызвана тем, что двоичные данные вставляются в буфер. Чтобы решить эту проблему, вы должны вставить один код в свой код.

Это утверждение:

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

Пример:

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

все решения, приведенные не работает .. Dont сосредоточиться только на получение части. luk при вставке изображения. Я сделал ту же ошибку. Я отобразил изображение с жесткого диска и сохранил его в базе данных. Проблема заключается в команде вставки. Luk в мой код неисправности ..:

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

Приведенный выше код показывает, успешно вставлен ... но actualy его сохранения изображения в виде неправильного типа данных .. в то время как тип данных должен бть «образ» .. так я улучшен код ..

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, что не будет ПАРАМЕТР нЕ ДЕЙСТВУЕТ ошибка в получении .... решаемые !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!

-3

В большинстве случаев, когда это происходит, это плохие данные в столбце SQL. Это правильный способ вставить в столбец изображения:

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

Большинство людей делают это неправильно таким образом:

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

Это единственное работающее решение в моем случае, спасибо! У меня есть несколько типов изображений для загрузки, а некоторые из них не могут загружаться с помощью Image.FromStream(). ImageConverter может загрузить их все :) –

+0

Те же ошибки "Параметр недействителен" – dalvir

-3

Просто Следуйте этим вставить значения в базу данных

// Строка подключения