C# PicutreBox 读取2MB图片时报 “内存不足”

uiwgi 2013-06-25 11:18:03
开发了一个显示图片的程序,读取的图片大小2MB左右,因为程序需要在一台机器上面,然后几个User通过远程桌面连接到服务器,在服务器上面远程程序,可每次2到3个User打开程序后,就会报:“内存不足”,我调试程序后发现在没有加载图片前,内存使用一切正常,在加载图片后,内存使用竟然一下增加了200MB左右,晕。。。。
实在是不知道为什么,网上找了下,也没有具体的说法,有人说是因为图片读取到内存后,反映出的200MB才是它真正的大小??可是直接看图片属性也就2MB左右呀,为什么呀?????

那些朋友,帮忙给解决下呀,或者指个方向也行呀,谢谢啦!!

pbShow.SizeMode = PictureBoxSizeMode.Zoom;
pbShow.Image = Image.FromFile(@"F:\SOP\0001.jpg");

...全文
868 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
pxm_Grace 2015-05-12
  • 打赏
  • 举报
回复
用了picbox.Image.Dispose();后就变成了这样。。。有大神指点吗?
pxm_Grace 2015-05-12
  • 打赏
  • 举报
回复
我也要做类似的东西,用picturebox显示照片,一张大概都是4-6MB,提示内存不足后我加了dispose(),GC.Collect();还是提示内存不足。 请问图片要怎么压缩显示啊?
pxm_Grace 2015-05-12
  • 打赏
  • 举报
回复
引用 18 楼 u013681032 的回复:
我也要做类似的东西,用picturebox显示照片,一张大概都是4-6MB,提示内存不足后我加了dispose(),GC.Collect();还是提示内存不足。 请问图片要怎么压缩显示啊?
最后用的是imagelist数组,可以有压缩的作用。可设置属性imagesize的值。
Tidal_Choidi 2013-06-29
  • 打赏
  • 举报
回复
引用 7 楼 stonespace 的回复:
如果你不调用pbShow.Image.Dispose();图片占用的内存不会得到及时的真正的释放,会累积起来最后造成内存溢出,
说的有道理,要及时的调用Dispose(),不妨可以试试。
uiwgi 2013-06-28
  • 打赏
  • 举报
回复
引用 15 楼 effun 的回复:
如果是2M的JPG,估计尺寸已经超出了屏幕的大小,这根本没有必要。 建议做成缩略图的形式,先把大图处理成小图加载到程序里,在需要的时候再加载原图。
这个程序在加载时就需要显示出全图,必要时还要放大显示呢。哎,。。。。无奈呀。
effun 2013-06-28
  • 打赏
  • 举报
回复
如果是2M的JPG,估计尺寸已经超出了屏幕的大小,这根本没有必要。 建议做成缩略图的形式,先把大图处理成小图加载到程序里,在需要的时候再加载原图。
uiwgi 2013-06-28
  • 打赏
  • 举报
回复
经过几次测试发现2M的图片加载后变成使用200M内存,可以是由于图片所在服务器过于繁忙(远程读取图片),造成读取数据时延时太大造成内存使用增加了。 在自己开发使用电脑上面测试读取图片一切正常,未发现有占用内存到100M以上的情况发生,把图片放置到另一个电脑,然后再去访问也没有发现异常,目前只能推测是实现环境中存放图片电脑繁忙造成的,在实际环境中程序读取图片显示时会有一个等待状态。而开发环境中是立即就显示出来了。 但这一猜想还未在实际环境中测试,先记录一下。
Regan-lin 2013-06-26
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
比如说我这里看到这个IE窗口,并不意味这IE窗口里每一个像素都常住在你的内存里。只是意味着(假设我的网卡驱动不是很强劲的话)那么可能我的内存确实瞬间申请那么多,但是你不用担心,因为以后还会重复使用这个200M空间,轻易不会变为400M、1600M....... 内存不是问题。你只要解决bug就好了。不要把精力放在占用的内存大小上。
+1
uiwgi 2013-06-26
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
200M内存不算什么,就算是1.2个G也不算大,因为现在内存条才多少钱一根? 只要你的程序有使用价值即可。 对于图片,不管它文件有多大,如果高清显示尺寸不小,那么你就应该考虑分割为多个图片,然后自动显示在一起。。
我现在的程序主要使用方式是通过远程桌面连接到一台Server上面运行的,也就是说,所有的资源都是使用同一台Server的,所以多个User使用时就会出现问题了,还有一个功能就是图片放大功能,当使用这个功能时,内存使用会瞬间增大2倍(我有使用GC.Collect()进行强制内存回收,每次放大或缩小后,但常用内存),所以这样内存使用的问题就不得不面对了,郁闷。。。。 有没有别的图片显示控件呀,可以不用这样太占用内存的?
Trent1985 2013-06-26
  • 打赏
  • 举报
回复
picturebox显示本来就占内存的,显示大图当然更耗内存了
uiwgi 2013-06-26
  • 打赏
  • 举报
回复
在网上又找了半天的资料,好像都没有什么解决办法,遇到这类问题的也少。郁闷呢
  • 打赏
  • 举报
回复
比如说我这里看到这个IE窗口,并不意味这IE窗口里每一个像素都常住在你的内存里。只是意味着(假设我的网卡驱动不是很强劲的话)那么可能我的内存确实瞬间申请那么多,但是你不用担心,因为以后还会重复使用这个200M空间,轻易不会变为400M、1600M....... 内存不是问题。你只要解决bug就好了。不要把精力放在占用的内存大小上。
stonespace 2013-06-25
  • 打赏
  • 举报
回复
如果你不调用pbShow.Image.Dispose();图片占用的内存不会得到及时的真正的释放,会累积起来最后造成内存溢出,
  • 打赏
  • 举报
回复
引用 楼主 uiwgi 的回复:
有人说是因为图片读取到内存后,反映出的200MB才是它真正的大小??可是直接看图片属性也就2MB左右呀,为什么呀?????
这个所谓“影射”没有根据。 .net程序会自动增长。比如说你的程序需要3M,它可能已经申请了20M;你的程序使用到20M,它可能已经申请到200M。 现在的内存价格这么便宜,难道你不觉得能够预先多申请一些内存的程序总比那些不断地重新清理内存、重新计算、重新申请的程序要更可行么?!
stonespace 2013-06-25
  • 打赏
  • 举报
回复
没什么好的方法,你最好把图片的尺寸缩小后再显示,一般来说如果内存占用有几百M的图片的高度和宽度都太大,你缩小它的高度和宽度,就会少占用内存, 另外,可能显示完一副图片之后,你的窗体关闭或者显示另一张图片之后,你忘了调用 Image的Dispose方法, if (pbShow.Image!=null) pbShow.Image.Dispose(); pbShow.Image = Image.FromFile(@"F:\SOP\0001.jpg"); 同样,如果pbShow控件被销毁或者它所在的窗体被关闭,也要执行一次if (pbShow.Image!=null) pbShow.Image.Dispose();然后再pbShow.Image=null;
  • 打赏
  • 举报
回复
200M内存不算什么,就算是1.2个G也不算大,因为现在内存条才多少钱一根? 只要你的程序有使用价值即可。 对于图片,不管它文件有多大,如果高清显示尺寸不小,那么你就应该考虑分割为多个图片,然后自动显示在一起。。
stonespace 2013-06-25
  • 打赏
  • 举报
回复
图片在内存中占用的空间和它的高度和宽度有关,也就是像素数目有关,像素越多占用内存越大,
stonespace 2013-06-25
  • 打赏
  • 举报
回复
图片文件一般都是压缩格式,2M一般都压缩几十倍,图片装入内存之后,都以不压缩的格式存在内存中,因为这样才能高速的显示和缩放等处理,所以图片在内存中占用的空间比在文件占用空间大得多,
人生导师 2013-06-25
  • 打赏
  • 举报
回复
2M左右的图片应该不适合用PictureBox控件来显示的了,唯一的解决方案应该只有通过转换图片的格式的方式来使图片的大小变小来进行显示

110,538

社区成员

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

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

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