2017-04-17 3 views
0

私はデータベースにバイト変換イメージを持っています。これらのイメージのタグがあります。 ユーザーは、リストボックスに目的のタグを入力して画像を検索する必要があります。 ピクチャボックスは、ピクチャ数まで作成する必要があります。データベースからバイトイメージを取得する

失敗エラーメッセージ:ここ

An unhandled exception of type 'System.ArgumentException' occurred in System.Drawing.dll 
Additional information: Parameter is not valid. 

は私のコードです。

PictureBox[] img = new PictureBox[9999]; 
      for (int j = 0; j < listBox1.Items.Count; j++) 
      { 
       con.Open(); 
       MySqlCommand cmdImgCount = new MySqlCommand("select count(scan.image) from deu_scanner.scan where scan.id_Image IN (select kw_img.FK_idImg from deu_scanner.kw_img where kw_img.FK_idKeyword IN (select keyword.idkeyword from deu_scanner.keyword where keyword.keywordName='" + listBox1.Items[j] + "'));", con); 
       imgCount = Convert.ToInt32(cmdImgCount.ExecuteScalar().ToString()); 
       con.Close(); 
       ArrayList ar = new ArrayList(); 

       for (int i = 0; i < imgCount; i++) 
       { 
        con.Open(); 
        MySqlCommand cmd = new MySqlCommand("select scan.image from deu_scanner.scan where scan.id_Image IN (select kw_img.FK_idImg from deu_scanner.kw_img where kw_img.FK_idKeyword IN (select keyword.idkeyword from deu_scanner.keyword where keyword.keywordName='" + listBox1.Items[j] + "'))", con); 
        MySqlDataReader dr = cmd.ExecuteReader(); 
        while (dr.Read()) 
        { 
         byte[] imagedata = (byte[])dr["image"]; 
         MemoryStream memorystream = new MemoryStream(imagedata, 0, imagedata.Length); 
         memorystream.Write(imagedata, 0, imagedata.Length); 
         memorystream.Position = 0; 
         Image sourceImg = Image.FromStream(memorystream, true); 
         clonedImg = new Bitmap(sourceImg.Width, sourceImg.Height); 
         var copy = Graphics.FromImage(clonedImg); 
         copy.DrawImage(sourceImg, 0, 0); 
         ar.Add(clonedImg); 
        } 

        con.Close(); 
       } 
       for (int k = 0; k < imgCount; k++) 
       { 
        img[k] = new PictureBox(); 
        img[k].Name = "image-" + k.ToString(); 
        img[k].Image = (Image)ar[k]; 
        img[k].Visible = true; 
        img[k].SizeMode = PictureBoxSizeMode.StretchImage; 
        img[k].SetBounds(12 + k * 150, 180, 120, 120); 
        this.Controls.Add(img[k]); 
        img[k].BringToFront(); 
       } 
} 

更新(コメント):データベースはImage -objectストリームから直接JPEGを読み取ることができ、このコード

SaveFileDialog save = new SaveFileDialog(); 
save.Filter = "JPEG(.JPG)|.jpg"; 
FileStream fs = new FileStream(save.FileName, FileMode.Open, FileAccess.Read); 
BinaryReader br = new BinaryReader(fs); 
byte[] data = br.ReadBytes(Convert.ToInt32(fs.Length)); 
br.Close(); 
fs.Close(); 
+1

どこが失敗しますか? – thst

+0

ここに。イメージsourceImg = Image.FromStream(memorystream、true); @thst – DilaraD

+0

Entity Framework 6を​​使用して[保存してイメージ(バイナリ)をSQL Serverから取得する]の可能な複製(http://stackoverflow.com/questions/25400555/save-and-retrieve-image-binary-from-sql-server) -using-entity-framework-6) –

答えて

0

が充填されています。それでも、ArgumentExceptionが返された場合は、dotnet documentsと言うと、画像はフォーマットが壊れています。

DBの内容を確認してください:データベースから読み込んだものを、独立したJPGビューアでテストする必要があります。データベースからデータを読み込んでファイルに書き込んだ後、そのファイルを有効なJPG 。 mysqlを使用しているので、mysqlのworkbenchツールやHeidiSQLを使用して、テーブルから直接BLOBデータを保存できます。

これを実行したら、JPGが読み込み可能であることを確認します。 そうでない場合は、コードを確認してください。あなたのDBアップローダー

可能性のある問題は:FileStream.lengthプロパティはストリーム、ないファイルサイズの長さを与えます。したがって、dbの内容は不完全である可能性があります。

私はSOを繰り返さないので、here is the way to properly copy the streamをデータベースのバイト配列に置き換えます。あなたはこのようなSTHで終了する必要が

FileStream fs = new FileStream(save.FileName, FileMode.Open, FileAccess.Read); 
MemoryStream memorystream = new MemoryStream(); 
fs.CopyTo(memorystream); 
byte[] data = memorystream.ToArray(); 
// close streams 

dataは今、選択したファイルからすべてのバイトが含まれています。

ファイルの存在など、これはOPに残っています:-)

+0

ありがとう、私は詳細な答えを待っている@ thst – DilaraD

関連する問題