2017-04-17 32 views
0

我在数据库中有字节翻译的图像。而且我有这些图像的标签。 用户需要通过在列表框中输入所需的标签来搜索图像。 PictureBox必须创建到最多的图片数量。从数据库中取出一个字节图像

失败的错误消息

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

更新(从注释):该数据库填充有该代码

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

这里; Image sourceImg = Image.FromStream(memorystream,true); @thst – DilaraD

+0

[使用实体框架6从SQL Server保存并检索图像(二进制)]的可能副本(http://stackoverflow.com/questions/25400555/save-and-retrieve-image-binary-from-sql-server -using-entity-framework-6) –

回答

0

Image的-object可以直接从一个流中读取JPEG。然而,如果它抛出一个ArgumentExceptiondotnet documents说,图像被打破格式。

检查DB内容:你应该测试你从一个独立的JPG观众数据库中读取内容:从数据库中加载数据,并将其写入文件,然后测试该文件是一个有效的JPG 。由于您使用的是mysql,因此您可以使用mysql工作台工具或HeidiSQL直接从表中保存blob数据,而不会出现任何可能存在问题的代码。

完成之后,请确保JPG可读。 如果没有,请检查编写代码。在你的数据库上传

可能的问题:FileStream.length属性赋予,而不是文件大小的长度。所以,数据库的内容可能不完整。

我不会重复SO,所以here is the way to properly copy the stream为数据库的字节数组。

你应该这样某物结束:

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

相关问题