我用VS 2010做了个小功能,把图片以二进制流存入SQL2008 R2,然后可以通过查询再显示在PictureBox里。显示的算法是用数据库查询得来的byte [] 转换成MemoryStream,再通过Image.FromStream获得图像。现在遇到这样一个问题:如果图片是JPG、BMP、PNG等静态图像,一切OK;如果图片是GIF动态图像,显示红叉。最搞笑的是,红叉还会传染给别的控件,比如Button,也变成了一个红叉;
但是!!!!如果事先将查询获得的二进制流转成一个临时文件,再通过Image.FromFile让PicturBox显示却也是好的。请问这个是它的BUG还是我疏漏了什么东东?谢谢!
但是!!!!如果事先将查询获得的二进制流转成一个临时文件,再通过Image.FromFile让PicturBox显示却也是好的。请问这个是它的BUG还是我疏漏了什么东东?谢谢!
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;
没有问题,是否图片问题
如果一样,肯定不是程序写的有问题,也不是你的RP问题了,呵呵。
你现在的情况是读取数据库的二进制gif数据后,赋值给picture.image属性,显示成了红色叉号。你可以看一下picture控件,有一个ErrorImage,默认就是红色叉号,估计你设置的image有问题,你把你读取数据库二进制字段后,重建image的代码,贴出来看看吧 MemoryStream ms = new MemoryStream(byteArrayIn);//byteArrayIn是一个读取自数据库的二进制图像字节数组
Image dbImage = Image.FromStream(ms);
pic1.Image=dbImage ;
{
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呢?
类型:System.IO.Stream 一个 Stream,包含此 Image 的数据。 返回值
类型:System.Drawing.Image此方法创建的 Image。
异常
异常 条件
ArgumentException 该流没有有效的图像格式- 或 -stream 为 null。
备注在 Image 的生存期内,必须使流保持打开。如果用相同的流连续调用该方法,该流将重置为零。
除非你保存image到文件中,然后你close掉,picture.Image还可以通过文件读取到,才可以正常。
this.picturebox1.Image;
不需要使用MemoryStream 变量