2009-03-10 81 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 +例外が非常に誤解を招くことがあるにもかかわらず、実際問題はビットマップコンストラクタに送信されたパラメータが有効でないことでした。次の行は、エラーの原因となった

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では、​​validateImageDataを有効にするにはuseEmbeddedColorManagementをfalseにする必要があることに注意してください。

メモリストリームをファイルにダンプして内容を検査することで、最も簡単にデバッグすることができます。

1

このエラーは、バイナリデータがバッファに挿入されたために発生します。 この問題を解決するには、コードに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

doesntの仕事与えられたすべてのソリューションは..取得する部分にのみ集中していけません。イメージの挿入時にluk。私は同じミスをしました。私はハードディスクからイメージを取り出し、データベースに保存しました。問題はinsertコマンドにあります。私のせいコードで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(); 
    } 

上記のコードは...データ型が「イメージ」をBTしなければならないのに対し..正常に挿入された...しかしactualyその、間違ったデータ型の形式で画像を保存示しだから私解決しよう....取り出すには何のPARAMETER有効でないエラーがないことをコード..

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%の島嶼地区などを改善!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!

-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

ただ、データベース

に値を挿入するには、この従ってください/ /接続文字列

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(); 
関連する問題