[求助]image.fromfile加载图片出现内存不足题

wangjinlong 2010-10-09 05:50:35
此问题网上很多人都遇到过,百度出来的解决方案似乎都不能解决,请高手帮忙。

程序代码就一行:System.Drawing.Image originalImage = System.Drawing.Image.FromFile(Server.MapPath("/up.jpg"));
图片大小:3.3MB 尺寸:3648*2736 正常的数码照片
经过测试当回收工作进程的时候,运行正常,当内存到达一定值的时候,问题就出现这个异常了。
在相同环境下,改变图片的尺寸也可以运行,比如用PS缩小到宽为3500px的时候正常,3057px的时候就不正常,且此数值不固定。

后来想到一个办法,就是当内存达到800M后自动回收工作进程,运行一天,没有问题,晚上就出现了一个莫名其妙的问题:“字符串转换时间函数Convert.ToDateTime”报错,所有用到的地方都提示“该字符串未被识别为有效的 DateTime”,随后,回收工作进程,一切正常,真郁闷了,也不知道和内存自动回收有没有关系。


运行后出现下面的错误提示:

Server Error in '/' Application.
--------------------------------------------------------------------------------

Out of memory.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.OutOfMemoryException: Out of memory.
Stack Trace:


[OutOfMemoryException: Out of memory.]
System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement) +380120
System.Drawing.Image.FromFile(String filename) +6
ASP.up_aspx.Button1_Click(Object sender, EventArgs e) +26
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +105
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +107
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5102


...全文
2246 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
boss_kg 2013-05-14
  • 打赏
  • 举报
回复
引用 12 楼 vrhero 的回复:
[Quote=引用 10 楼 lnsy_wjl 的回复:] 引用 8 楼 li45214521 的回复: 你这个图片内存需要38M你说大不大 这样一个大的图片应该是不行的 怎么算出来了的? [/Quote] 像素x位深/8...不一定38M,32位色才有那么大...你图片大小3648*2736,24位色就是28M多,16位色就是19M多...基础知识... 你这图片不算太大,但是加载太多就有问题...要及时释放内存,不显示的图片要释放... 另外...FromFile方法如果文件没有有效的图像格式或者如果GDI+不支持文件的像素格式,也会引发OutOfMemoryException异常...留意一下是普遍情况还是个别文件有问题...
我的就是某些图片就会出现这种问题。请教是什么原因!!
WOFECH 2012-08-14
  • 打赏
  • 举报
回复
问题已经找到 ,你上传的图片大小为0 即此图片是一个空图片 因此会引发内存不足的异常
chuxue1342 2010-10-11
  • 打赏
  • 举报
回复
哪里就问题就去哪里找啊~~程序做好之后多调试一下吧~~如果实在不行,就把格式转换的语句写完善一点!
vrhero 2010-10-11
  • 打赏
  • 举报
回复
“最后释放”是多久?你的并发量是多少?有没有做缓存?缓存策略是怎样的?

做做压力测试...也许只是你的硬件条件不够用了,需要升级或扩充服务器...

ps:关于日期处理,你的做法超级不正规...去看看MSDN中DateTime.ParseExact方法和日期时间格式化的部分...
wangjinlong 2010-10-11
  • 打赏
  • 举报
回复
另外,日期处理报错有哪位兄台遇到过啊,都是一些怪问题。。
wangjinlong 2010-10-11
  • 打赏
  • 举报
回复
纠结中。。。
wangjinlong 2010-10-11
  • 打赏
  • 举报
回复
这张图片肯定没有问题的,位深度是24,关于文件处理的相关对象最后也都释放了,我觉得是不是这样的原因呢:.Net 2.0环境对内存管理造成的,因为当回收内存的时候,就一切正常了,当内存到达一个相对峰值时,应用程序对单个对象占用内存的大小就有限制了呢。测试中,这个图片在小一点点就没有问题了。
vrhero 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lnsy_wjl 的回复:]
引用 8 楼 li45214521 的回复:
你这个图片内存需要38M你说大不大 这样一个大的图片应该是不行的

怎么算出来了的?
[/Quote]
像素x位深/8...不一定38M,32位色才有那么大...你图片大小3648*2736,24位色就是28M多,16位色就是19M多...基础知识...

你这图片不算太大,但是加载太多就有问题...要及时释放内存,不显示的图片要释放...

另外...FromFile方法如果文件没有有效的图像格式或者如果GDI+不支持文件的像素格式,也会引发OutOfMemoryException异常...留意一下是普遍情况还是个别文件有问题...
chuxue1342 2010-10-11
  • 打赏
  • 举报
回复
System.Drawing.Image originalImage = System.Drawing.Image.FromFile(Server.MapPath("/up.jpg"));
----------------------------------------------------------------------------------
这行代码是存在内在泄露的问题,特别是如果你的路径不存在这个文件时最明显,之前我也遇到过类似的情况,在这段代码前加一个try就行了!如:
Try
{
System.Drawing.Image originalImage = System.Drawing.Image.FromFile(Server.MapPath("/up.jpg"));

}
Catch
{
//不成功
}
wangjinlong 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 li45214521 的回复:]
你这个图片内存需要38M你说大不大 这样一个大的图片应该是不行的
[/Quote]
怎么算出来了的?
zhubo006 2010-10-10
  • 打赏
  • 举报
回复
li45214521 2010-10-10
  • 打赏
  • 举报
回复
你这个图片内存需要38M你说大不大 这样一个大的图片应该是不行的
wangjinlong 2010-10-09
  • 打赏
  • 举报
回复
关于时间转换函数,有人说是这个函数的Bug,并给出了下面这个函数,一般很少出现这种情况。。。
/// <summary>
/// 得到格式 yyyy-MM-dd HH:mm:ss.fff 日期型, 是否补0、是否有时间、是否有毫秒都行
/// 支持只要是按照 年 月 日 小时 分钟 秒 毫秒 排列的任何字符串,分隔符可以是 ' ', '-', ':', '.', '/', '\\', ','
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static DateTime GetDateTime_Cn(string value)
{
string[] valueItem = value.Split(new char[] { ' ', '-', ':', '.', '/', '\\', ',' });
return new DateTime(Convert.ToInt32(valueItem[0]), Convert.ToInt32(valueItem[1]), Convert.ToInt32(valueItem[2]),
valueItem.Length > 3 ? Convert.ToInt32(valueItem[3]) : 0,
valueItem.Length > 4 ? Convert.ToInt32(valueItem[4]) : 0,
valueItem.Length > 5 ? Convert.ToInt32(valueItem[5]) : 0,
valueItem.Length > 6 ? Convert.ToInt32(valueItem[6]) : 0);
}
wangjinlong 2010-10-09
  • 打赏
  • 举报
回复
纠正一个错误:比如用PS缩小到宽为3500px的时候正常,3557px的时候就不正常
wangjinlong 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyq11 的回复:]
可以一段一段的读
如果文件没有有效的图像格式,或者如果 GDI+ 不支持文件的像素格式,则此方法将引发 OutOfMemoryException 异常
检查datetime数据
[/Quote]
图片和日期字符串肯定都没有问题,回收工作进程,就都整常了,也都Dispose了
li45214521 2010-10-09
  • 打赏
  • 举报
回复
你这样的话 为什么不把他设为静态的呢,如果你有引用你的对象,垃圾回收就不会运作,而你是web程序,应该使用后就Dispose就可以了
wuyq11 2010-10-09
  • 打赏
  • 举报
回复
可以一段一段的读
如果文件没有有效的图像格式,或者如果 GDI+ 不支持文件的像素格式,则此方法将引发 OutOfMemoryException 异常
检查datetime数据
wwfgu00ing 2010-10-09
  • 打赏
  • 举报
回复
贴上代码

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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