2012-01-13 21 views
3

イメージをデータベースに保存していて、バイト配列からイメージに変換したいと考えています。オブジェクトをバイト配列に変換するのに問題はありませんが、バイト配列からイメージに変換しようとすると "Parameter is not valid"というエラーが発生します。私のメソッドに渡すオブジェクトは、データセットの行からです。バイト配列をイメージに変換する:パラメータが無効です

ストアドプロシージャの

USE [----------------] 
GO 
/****** Object: StoredProcedure [dbo].[usp_imageloader_add_test] Script Date: 01/16/2012 09:19:46 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER procedure [dbo].[usp_imageloader_add_test] 
@p_Image Image 

as 

INSERT into Test_Images VALUES(@p_Image) 

ファイルのアップロード制御 /バイト配列へのイメージファイルを変換し、

protected void btnUpload_Click(object sender, EventArgs e) 
    { 
     if (ctrlUpload.PostedFile != null) 
     { 
      if (ctrlUpload.PostedFile.ContentLength > 0) 
      { 
       // Get Posted File 
       HttpPostedFile objHttpPostedFile = ctrlUpload.PostedFile; 

       // Find its length and convert it to byte array 
       int ContentLength = objHttpPostedFile.ContentLength; 

       // Create Byte Array 
       byte[] bytImg = new byte[ContentLength]; 

       // Read Uploaded file in Byte Array 
       objHttpPostedFile.InputStream.Read(bytImg, 0, ContentLength); 

       using (SqlConnection dbConnection = new SqlConnection(app_settings.sql_conn_string_db)) 
       { 
        try 
        { 
         string sql = "usp_imageloader_add_test"; 
         SqlCommand cmd = new SqlCommand(sql, dbConnection); 
         cmd.CommandType = System.Data.CommandType.StoredProcedure; 
         cmd.Parameters.AddWithValue("@p_Image", bytImg).SqlDbType = SqlDbType.Image; 
         cmd.Connection.Open(); 
         cmd.ExecuteNonQuery(); 
         cmd.Connection.Close(); 
        } 


        catch (Exception ex) 
        { 
         ex.Message.ToString(); 
        } 
       } 
      } 
     } 
    } 

変換オブジェクトバイト配列にし、画像

にデータベースにデータを保存
private System.Drawing.Image ObjToImg(object obj) 
    { 
     byte[] byteArray; 
     if (obj == null) 
      return null; 
     else 
     { 
      BinaryFormatter bf = new BinaryFormatter(); 
      MemoryStream ms = new MemoryStream(); 
      bf.Serialize(ms, obj); 
      byteArray = ms.ToArray(); // Byte Array 
      ms.Close(); 

      ms = new MemoryStream(byteArray, 0, byteArray.Length); 
      ms.Seek(0, SeekOrigin.Begin); 
      System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms); 
      return returnImage; 
     } 

すべてのアイデアが参考になります。

+0

http://stackoverflow.com/a/6712677/284240ファイルにバイナリデータを保存し、画像エディタは、彼がことを確認する必要があり、それ –

答えて

1

は、次のことを試してみてください、あなたのストリームは、最初に初期化されないことがあります。

ms = new MemoryStream(byteArray, 0, byteArray.Length); 
ms.Seek(0, SeekOrigin.Begin); 
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms); 

それは、画像のどのようなタイプですか?保存されている画像が有効であることを確かめますか?

また、使用に関するコメント(問題には影響しません)では、ストリームを操作するときにusingステートメントを使用することをお勧めします。例:

using (MemoryStream ms = new MemoryStream()) 
{ 
    // your code here 
} 
+1

にどのように応答するかを見ますストリームは彼が画像で終わるまで開いたままです。 – insipid

+0

私はそれを試して、それが動作するかどうかを確認します。 –

+0

メモリストリームからイメージを描画しようとする前に、ストリームが先頭を指しているコードを修正しましたが、それでも同じエラーがスローされます。 –

1

生のRGBデータを使用しているデータはありますか?その場合、FromStream()のドキュメントには、ストリームに生のRGBデータが含まれている場合にメソッドがスローされるというユーザのコメントがあります。http://msdn.microsoft.com/en-us/library/93z9ee4x.aspx(ページの下部を参照)。代わりにビットマップを使用することをお勧めします(http://msdn.microsoft.com/en-us/library/zy1a2d14.aspx)。

0

Kelseyによる解決策が有効です。これは、byteArrayからメモリストリームにデータを読み込むときに、ポインタがストリームの最後に置かれ、このメモリストリームからデータを読み込もうとすると、このポインタの先頭を読み込もうとするためです。この後にデータがない場合、エラーが発生します。今度はms.Seek(0, SeekOrigin.Begin);を実行すると、リーダーポインタがメモリストリームの先頭に配置されます。そして、あなたがそれを使用し終わったら、メモリストリームを処分してください。ms.Dispose()。お役に立てれば。

2

Image.FromStreamは、画像形式が無効であるため、おそらくArgumentExceptionを投げています。有効なイメージとしてフォーマットされるランダムなシリアル化されたオブジェクトが妥当でないことを期待しています。

+0

アイデアが足りないため、コードを変更することをどのように提案しますか? –

+0

あなたはまったくシリアル化してはいけません。意味がありません。パラメータがデータセットから来た場合は、すでにバイト型の配列であるはずです。 – insipid

0

バイナリフォーマッタは必要ありません。これは、データを混乱させることです。実際にオブジェクトを直列化するためです。

注目すべき重要な点は、オブジェクトがすでにバイト配列であるため、それをキャストして使用できることです。

これを試してください: -

private System.Drawing.Image ObjToImg(object obj) 
    { 
     if (obj == null) 
      return null; 
     else 
     { 
      byte[] byteArray = (byte[])obj; 
      System.Drawing.Image returnImage; 
      using (var ms = new MemoryStream(byteArray, 0, byteArray.Length)) 
      { 
       returnImage = System.Drawing.Image.FromStream(ms); 
      } 
      return returnImage; 
     } 
    } 
関連する問題