我用VS 2010做了个小功能,把图片以二进制流存入SQL2008 R2,然后可以通过查询再显示在PictureBox里。显示的算法是用数据库查询得来的byte [] 转换成MemoryStream,再通过Image.FromStream获得图像。现在遇到这样一个问题:如果图片是JPG、BMP、PNG等静态图像,一切OK;如果图片是GIF动态图像,显示红叉。最搞笑的是,红叉还会传染给别的控件,比如Button,也变成了一个红叉;
但是!!!!如果事先将查询获得的二进制流转成一个临时文件,再通过Image.FromFile让PicturBox显示却也是好的。请问这个是它的BUG还是我疏漏了什么东东?谢谢!

解决方案 »

  1.   

    希望不是我的RP问题 :D 
      

  2.   

    从有vs那天开始picturebox从来就没有正确兼容所以的gif图片。
      

  3.   

    已经不指望它能动了,但也别红叉啊回头找台 xp + vs08的机器同样的代码再编译下看看
      

  4.   

    gif 格式图片用label 才能动.....
      

  5.   

    如果在环境中把JIF文件导入放在pictureBox中的话,是可以动的!
      

  6.   

    Image img=Image.FromFile("");
    MemoryStream ms=new MemoryStream ();
    img.Save(ms,ImageFormat.Gif);..
    cmd.Parameters.Add("@img",SqlDbTpe.Image);
    cmd.Parameters["@img"].Value=ms.ToArray();
    cmd.ExecuteNonQuery();
    ...
    读取
    byte[] photo=(byte[])dr[[1];
    Image img=Image.FromStream(new MemoryStream(photo));
    this.picturebox1.Image;
    没有问题,是否图片问题
      

  7.   

    你先试试看,直接在窗体上放一个picture控件,然后在属性中设置一个gif动画给它,是否一样?
    如果一样,肯定不是程序写的有问题,也不是你的RP问题了,呵呵。
      

  8.   

    我看了一下,picture是可以正常显示gif动画的。本身控件没有问题。
    你现在的情况是读取数据库的二进制gif数据后,赋值给picture.image属性,显示成了红色叉号。你可以看一下picture控件,有一个ErrorImage,默认就是红色叉号,估计你设置的image有问题,你把你读取数据库二进制字段后,重建image的代码,贴出来看看吧     MemoryStream ms = new MemoryStream(byteArrayIn);//byteArrayIn是一个读取自数据库的二进制图像字节数组
         Image dbImage = Image.FromStream(ms);
         pic1.Image=dbImage ;
      

  9.   

                byte[] data = new DataAccess.DataMain().GetFileData(fid);            if (data != null)
                {
                    MemoryStream ms = null;                try
                    {
                        ms = new MemoryStream(data);
                        pictureBox1.Image = Image.FromStream(ms);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                    finally
                    {
                        //if (ms != null)
                        //{
                        //    ms.Close();
                        //    ms.Dispose();
                        //}
                    }            }
                else
                {
                    MessageBox.Show("载入图片错误。");
                }找到原因了。finally中代码注释掉就正常显示GIF了,而且会动。但为什么只影响GIF呢?
      

  10.   

    参数stream
        类型:System.IO.Stream    一个 Stream,包含此 Image 的数据。 返回值
    类型:System.Drawing.Image此方法创建的 Image。
    异常
    异常 条件
    ArgumentException 该流没有有效的图像格式- 或 -stream 为 null。
    备注在 Image 的生存期内,必须使流保持打开。如果用相同的流连续调用该方法,该流将重置为零。 
      

  11.   

    pictureBox1.Image = Image.FromStream(ms);你的Image,是内存中的,所以你close掉,当然有问题了!
    除非你保存image到文件中,然后你close掉,picture.Image还可以通过文件读取到,才可以正常。
      

  12.   

    Image img=Image.FromStream(new MemoryStream(photo));
    this.picturebox1.Image;
    不需要使用MemoryStream 变量