winform二进制数组转图片报内存不足

星先 2014-11-13 11:30:21
图片只有5MB,程序不关闭,存个几张还成,连续读取十几张二十张,就开始内存不足了。
求助,我该怎么去释放才可以。
存储十几个之后,就在Image.FromStream这儿提示内存不足。
各位大侠给支支招。
这样写,报内存不足

private System.Drawing.Image ReturnPhoto(byte[] streamByte)
{
ms = new System.IO.MemoryStream(streamByte);
try
{
img = System.Drawing.Image.FromStream(ms);//报内存不足
}
catch (Exception ex)
{

}
if (ms != null) ms.Close();
return img;
}

这样写,也还是报

private System.Drawing.Image ReturnPhoto(byte[] streamByte)
{
if (ms != null) ms.Dispose();
if (img != null) img.Dispose();
if (ms != null) ms.Dispose();
ms = new System.IO.MemoryStream(streamByte);
try
{
img = System.Drawing.Image.FromStream(ms);//报内存不足
}
catch (Exception ex)
{

}
if (ms != null) ms.Close();
return img;
}
...全文
307 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
星先 2014-11-17
  • 打赏
  • 举报
回复
引用 3 楼 a1871837908 的回复:
楼主解决好了吗,我也遇到这样的问题啦
我的貌似是解决了,不是没对流和图片释放的问题。应该是被PictureEdit控件占住了图片和流,无法进行彻底释放。我把这控件的Image给释放,目前尝试存了百来张5MB的,没在溢出。如果你也是有用控件将图片给显示出来,也尝试下在流和图片都关闭之后,将这个图片显示控件在窗体关闭前也做一次累死Dispose的操作吧
卧_槽 2014-11-14
  • 打赏
  • 举报
回复
引用 8 楼 xxhhl_2238677164 的回复:
将图像以二进制流形式存储到数据库中示例 protected void imgbtnCreate_Click(object sender, ImageClickEventArgs e) { string PerHomeName=tbPerHomeName.Text;//获取空间名 string PerHomeSign=txtPerSign.Text; //获取个性签名 string imgPath = uploadFile.PostedFile.FileName;//获取文件件名 string lastName = imgPath.Substring(imgPath.LastIndexOf(".") + 1);//获取文件上传后缀名 SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["conStr"]); conn.Open(); if (uploadFile.PostedFile.FileName != "" && lastName.ToLower() == "jpg" || lastName.ToLower() == "gif") { if (uploadFile.PostedFile.ContentLength > 40960) { Response.Write("<script language='javaScript'>alert('你上传的图片超过了40KB!')</script>"); return; } int imgLength = uploadFile.PostedFile.ContentLength;//获取上传文件大小 Byte[] imageData = new Byte[imgLength]; //定义Byte数组 HttpPostedFile hp = uploadFile.PostedFile;//创建访问客户端上传文件的对象 Stream imagestream = hp.InputStream;//创建数据流对象 //将图片数据放到image数据对象实例中,其中0代表数组指针的起始位置,imagelength表示要读取流的长度 imagestream.Read(imageData, 0, imgLength); string sqlstr = "insert into PerHomeDetail(PerHomeName,PerHomeSign,PerHomeLogo)values('" + PerHomeName + "','" + PerHomeSign + "',@ImageData)"; SqlCommand comm = new SqlCommand(sqlstr, conn); comm.Parameters.Add("@ImageData", SqlDbType.Image); comm.Parameters["@ImageData"].Value = imageData; comm.ExecuteNonQuery(); conn.Close(); Response.Write("<Script>alert('个人空间创建成功!')</Script>"); } else { Response.Write("<script>alert('上传头像不能为空,且格式必须为gif或jpg!');location='javascript:history.go(-1)'</script>"); } }
copy paste很有成就感么?
w_xxxbbb 2014-11-14
  • 打赏
  • 举报
回复
学习了。
卧_槽 2014-11-14
  • 打赏
  • 举报
回复
图片用完记得dispose就可以了。
xxhhl_2238677164 2014-11-14
  • 打赏
  • 举报
回复
将图像以二进制流形式存储到数据库中示例 protected void imgbtnCreate_Click(object sender, ImageClickEventArgs e) { string PerHomeName=tbPerHomeName.Text;//获取空间名 string PerHomeSign=txtPerSign.Text; //获取个性签名 string imgPath = uploadFile.PostedFile.FileName;//获取文件件名 string lastName = imgPath.Substring(imgPath.LastIndexOf(".") + 1);//获取文件上传后缀名 SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["conStr"]); conn.Open(); if (uploadFile.PostedFile.FileName != "" && lastName.ToLower() == "jpg" || lastName.ToLower() == "gif") { if (uploadFile.PostedFile.ContentLength > 40960) { Response.Write("<script language='javaScript'>alert('你上传的图片超过了40KB!')</script>"); return; } int imgLength = uploadFile.PostedFile.ContentLength;//获取上传文件大小 Byte[] imageData = new Byte[imgLength]; //定义Byte数组 HttpPostedFile hp = uploadFile.PostedFile;//创建访问客户端上传文件的对象 Stream imagestream = hp.InputStream;//创建数据流对象 //将图片数据放到image数据对象实例中,其中0代表数组指针的起始位置,imagelength表示要读取流的长度 imagestream.Read(imageData, 0, imgLength); string sqlstr = "insert into PerHomeDetail(PerHomeName,PerHomeSign,PerHomeLogo)values('" + PerHomeName + "','" + PerHomeSign + "',@ImageData)"; SqlCommand comm = new SqlCommand(sqlstr, conn); comm.Parameters.Add("@ImageData", SqlDbType.Image); comm.Parameters["@ImageData"].Value = imageData; comm.ExecuteNonQuery(); conn.Close(); Response.Write("<Script>alert('个人空间创建成功!')</Script>"); } else { Response.Write("<script>alert('上传头像不能为空,且格式必须为gif或jpg!');location='javascript:history.go(-1)'</script>"); } }
effun 2014-11-13
  • 打赏
  • 举报
回复
ms改成局部变量试试
effun 2014-11-13
  • 打赏
  • 举报
回复
引用 6 楼 github_22161131 的回复:
GDI+报的内存不足基本都不是内存不足,而是因为GDI+对内存的使用和.net的GC机制一直都有些冲突。 如果是用MemoryStream创建image,不要手动close或者dispose它,很可能会出错的(也有办法能让它100%重现out of memory),你的代码里把if (ms != null) ms.Close();去掉说不定就好了。如果不行,那需要保持对ms的引用,不要让它被GC。
这让我想起了MSDN里FromStream的一段话: You must keep the stream open for the lifetime of the Image.
winnowc 2014-11-13
  • 打赏
  • 举报
回复
GDI+报的内存不足基本都不是内存不足,而是因为GDI+对内存的使用和.net的GC机制一直都有些冲突。 如果是用MemoryStream创建image,不要手动close或者dispose它,很可能会出错的(也有办法能让它100%重现out of memory),你的代码里把if (ms != null) ms.Close();去掉说不定就好了。如果不行,那需要保持对ms的引用,不要让它被GC。
hwangt0 2014-11-13
  • 打赏
  • 举报
回复
public bool SetPic(byte[] filebytes)
        {
                MemoryStream ms = new MemoryStream(filebytes);
                Image img = Image.FromStream(ms);

                ms.Close();
                ms.Dispose();
}
试试
星先 2014-11-13
  • 打赏
  • 举报
回复
引用 3 楼 a1871837908 的回复:
楼主解决好了吗,我也遇到这样的问题啦
还没有。。我也在查解决办法。。
慕容引刀 2014-11-13
  • 打赏
  • 举报
回复
楼主解决好了吗,我也遇到这样的问题啦
星先 2014-11-13
  • 打赏
  • 举报
回复
引用 1 楼 effun 的回复:
ms改成局部变量试试
本来是方法内的局域变量来着,连Image也是,也报这错误来着。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧