2009-03-10 43 views
26

Tại sao tôi lại nhận được ngoại lệ "Parameter không hợp lệ" trong mã của tôi:"Parameter không hợp lệ" ngoại lệ bốc System.Drawing.Image

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

Chiều dài của byteArrayIn là 169014. Tôi nhận được ngoại lệ này mặc dù thực tế là không có giá trị nào trong số đó lớn hơn 255.

+1

vui lòng định dạng câu hỏi của bạn đúng cách –

+0

'không có giá trị nào trong số đó không lớn hơn 255' là sai, sai số âm của nó, làm cho nó dương. Vì vậy, bạn nói rằng tất cả các giá trị là trên 255. Tôi đoán bạn có nghĩa là họ là tất cả ít hơn hoặc bằng 255, mà là một rào cản nội tại của một byte. –

Trả lời

3

Dòng nào đang ném ngoại lệ? new MemoryStream(...)? hoặc Image.FromStream(...)? Và byteArrayIn là gì? Có phải là byte[] không? Tôi chỉ hỏi vì nhận xét "Và không có giá trị nào trong đó không lớn hơn 255" - tất nhiên là tự động cho một số byte[].

Như một câu hỏi rõ ràng hơn: liệu tệp nhị phân có thực sự chứa hình ảnh ở định dạng hợp lý không?

Ví dụ, sau đây (mặc dù không lớn code) hoạt động tốt:

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

tôi đoán là byteArrayIn không chứa dữ liệu hình ảnh hợp lệ.

Xin vui lòng cho biết thêm thông tin mặc dù:

  • Những dòng mã là ném một ngoại lệ?
  • Tin nhắn là gì?
  • Nơi nào bạn nhận được byteArrayIn từ và bạn có chắc chắn nó phải chứa hình ảnh hợp lệ không?
+1

Cảm ơn Jon, câu trả lời này cho phép tôi tìm một giải pháp cho Tham số của tôi không phải là ngoại lệ hợp lệ. 1 cho bạn – Sebastian

+0

Thật vậy, tôi thấy rằng "Tham số không hợp lệ" trong trường hợp đó hầu như luôn luôn chỉ ra dữ liệu bị hỏng/không hợp lệ – Yandros

17

Tôi đã gặp vấn đề tương tự và được giải quyết ngay bây giờ, mặc dù điều này và một số ngoại lệ khác của Gdi + rất sai lệch, tôi thấy rằng vấn đề là tham số được gửi tới một hàm tạo bitmap không hợp lệ. Tôi có mã này:

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

Các dòng sau đã gây ra một lỗi:

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

Các dòng tập tin được xây dựng từ các tập tin tải về từ Map Server. Ứng dụng của tôi đã gửi yêu cầu không chính xác để tải hình ảnh và máy chủ đã trả về một thứ gì đó có phần mở rộng jpg, nhưng thực ra là một html cho tôi biết rằng có lỗi xảy ra. Vì vậy, tôi đã lấy hình ảnh đó và cố gắng xây dựng một Bitmap với nó. Sửa chữa là để kiểm soát/xác thực hình ảnh cho một hình ảnh jpeg hợp lệ.

Hy vọng điều đó sẽ hữu ích!

1

Ngoại lệ "thông số không hợp lệ" được ném bởi Image.FromStream() cho bạn biết rằng luồng không phải là định dạng 'hợp lệ' hoặc 'được công nhận'. Xem các luồng bộ nhớ, đặc biệt nếu bạn đang lấy các tập hợp byte khác nhau từ một tệp.

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

Ví dụ 2 sẽ hoạt động, lưu ý rằng sử dụngEmbeddedColorManagement phải sai để xác thựcImageData hợp lệ.

Có thể dễ dàng nhất để gỡ lỗi bằng cách đổ luồng bộ nhớ vào tệp và kiểm tra nội dung.

1

Lỗi này do dữ liệu nhị phân được chèn vào bộ đệm. Để giải quyết vấn đề này, bạn nên chèn một câu lệnh vào mã của bạn.

Tuyên bố này là:

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

Ví dụ:

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

tất cả các giải pháp cho việc doesnt .. không chỉ tập trung vào phần nhặt đồ. luk lúc chèn hình ảnh. tôi đã phạm sai lầm tương tự. Tôi tuk một hình ảnh từ đĩa cứng và lưu nó vào cơ sở dữ liệu. Vấn đề nằm trong lệnh chèn. luk vào mã lỗi của tôi ..:

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

Đoạn mã trên cho thấy thành công chèn ... nhưng actualy tiết kiệm của mình hình ảnh dưới dạng datatype sai .. trong khi datatype phải bt "hình ảnh" .. vì vậy tôi cải thiện mã ..

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% bảo lãnh rằng sẽ không có THÔNG SỐ kHÔNG HỢP LỆ lỗi trong lấy .... SOLVED !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!

-3

Hầu hết thời gian khi điều này xảy ra, đó là dữ liệu xấu trong cột SQL. Đây là cách thích hợp để chèn vào một cột hình ảnh:

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

Hầu hết mọi người làm điều đó không đúng theo cách này:

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

Đây là giải pháp làm việc duy nhất trong trường hợp của tôi, cảm ơn bạn! Tôi có vài loại hình ảnh để tải và một số trong số chúng không thể tải bởi Image.FromStream(). ImageConverter có thể tải tất cả :) –

+0

Lỗi tương tự "Tham số không hợp lệ" – dalvir

-3

Chỉ cần làm theo này để chèn giá trị vào cơ sở dữ liệu

// Chuỗi kết nối

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(); 
Các vấn đề liên quan