从服务器获取位图时内存不足?
Posted
技术标签:
【中文标题】从服务器获取位图时内存不足?【英文标题】:Running out of memory when getting a bitmap from a server? 【发布时间】:2010-04-14 11:54:53 【问题描述】:我正在制作一个使用许多图像的应用程序。该应用程序从服务器获取图像,并一次下载一个。 在许多图像之后,位图的创建返回一个异常,但我不知道如何解决这个问题。这是我下载图片的功能:
public static Bitmap getImageFromWholeURL(String sURL)
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(sURL);
myRequest.Method = "GET";
// If it does not exist anything on the url, then return null
try
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(myResponse.GetResponseStream());
myResponse.Close();
return bmp;
catch (Exception e)
return null;
有人可以帮我吗? 提前致谢!
【问题讨论】:
你对返回的 bmp 对象做了什么?在此处发布该代码。 【参考方案1】:将该响应流式传输到磁盘而不是将其保存在内存中。然后将有关您已保存到临时位置而不是图像本身的图像的信息保留。
【讨论】:
【参考方案2】:如果您在 Picturebox 中显示所有这些(并且基于您的 cmets 我认为您是),那么您应该处理旧图像(this blog entry 帮助解释它):
if(myPictureBox.Image != null)
myPictureBox.Image.Dispose();
myPictureBox.Image = getImageFromWholeURL(url);
作为风格的旁注,方法名称应该是 PascalCase,而不是 camelCase,我会失去参数上的匈牙利概念。
【讨论】:
啊,对不起,我对图片框的评论有点误解了。每个图像都有自己的图片框。但我想我已经找到了一个我可以忍受的解决方案。我有一个算法可以检查最近的邻居,并检查它是否有图像。如果邻居不包含图像 -> 下载图像。我现在还需要做的是有一个算法来删除不在视图中的图像。这样我就不会在内存中保留那么多图像。【参考方案3】:“许多图像”当然与内存不足密切相关。位图可能会变大,它们会占用大量非托管虚拟内存。你必须让你的程序更智能,并在内存中存储更少的位图。或者将它们临时保存到文件中。或在必要时重新下载它们。并使用 Dispose() 方法正确清理它们的资源,这对于 Bitmap 类尤其重要。
【讨论】:
我下载的每一张图片,我都在图片框中使用。所以这可能是造成它的原因。 是的,这迟早会戛然而止。只使用固定数量的 PB,编写一个滚动算法,将现有的 PB 重新用于新图片。不要忘记 Dispose() 旧的。 是的,我做了一个滚动算法,但它没有处理任何 PB,但现在它已经实现并且可以工作了:) 但如果滚动到该区域,重新使用 PB 而不是删除整个 PB 并插入新的,它可能会做得更好。【参考方案4】:您如何处理 System.Drawing.Bitmap 对象?你把它们都记在心里了吗?那么你不可避免地会在某个时候遇到内存不足的异常。
根据您的需要,您应该在某个时候丢弃图像。如果您确实需要它们,请将它们存储在闪存中的文件中。另外,请尝试使用较小的文件。
【讨论】:
我下载的每张图片,我都在图片框中使用。所以这可能是造成它的原因。 我正在下载最大 250kb 的小 .png 文件。 png 文件的大小无关紧要。重要的是图像的尺寸。当转换为位图时,所需的内存将为宽度*高度*[每像素的位数]。位数取决于 PixelFormat(可以是 16、24 或 32 位)。我不知道哪个是默认值。您可以尝试使用不同的构造函数来调整它。以上是关于从服务器获取位图时内存不足?的主要内容,如果未能解决你的问题,请参考以下文章