C# WinForm 循环加载图片出现内存不足

用了一个listBox1控件加载了某目录下50张图片的文件路径信息。privatevoidbutton1_Click(objectsender,EventArgse){i... 用了一个 listBox1控件加载了某目录下50张图片的文件路径信息。

private void button1_Click(object sender, EventArgs e)
{
int i=1;

foreach (string s in listBox1.Items)
{
Image img = new Bitmap(Image.FromFile(s)); //这个地方一般历遍到第27张就出现内存不足。
i = i++ ;
MessageBox.Show(i.ToString()); // 历遍到27

img.Dispos

}

说明:只做了加载后,就立即释放资源,这个循环也会出错。更用不说对img做什么处理了。 Image img = new Bitmap(Image.FromFile(s)); 历遍到第27张就出现内存不足。
在操作系统任务管理器的进程里看到历遍一个就增加一下内存。增到1,417,916K左右就出现内存不足。img.Dispos并不能及时释放资源。

高手门,有什么方法可以及时释放资源的?指点下啊!感激不尽!
展开
 我来答
老鸟是什么
2013-01-25 · TA获得超过117个赞
知道答主
回答量:180
采纳率:0%
帮助的人:70.1万
展开全部
首先i=i++;就是不对的。
再者你的图片多大啊,27张就用了1.5g的内存。
更多追问追答
追问
i=i++; 这个地方是次要的,只是为了记录历遍了多少次。
每张图片有4M左右。都是用专业相机照的相片,50张是用来测试的了,我的服务器有上差不多一万张。对存储需求非上大。所以要写个程序去批量缩小图片象素。不需要这么专业高清的图片,单张的图片我实现了。但批量的处理时就不行了,提示内存不足。后来我一步步排除。发现单单就是历编加载图片,然后立即释放资源都提示内存不足。
追答
你可以看看这部分代码,对比一下哪里不对。
Bitmap bt = new Bitmap(120, 120); //创建Bitmap实例
Graphics g = Graphics.FromImage(bt); //创建Graphics实例
g.Clear(Color.White); //设置画布背景颜色为白色
Image ReducedImage; //缩略图
Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent); //设置宽度
ImageHeight = Convert.ToInt32(ResourceImage.Height * Percent); //设置高度
//获取所谓图
ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);
if (ImageWidth > ImageHeight) //如果原图宽度大于高度
{
//缩放图片
g.DrawImage(ReducedImage, 0, (int)(120 - ImageHeight) / 2, ImageWidth, ImageHeight);
}
else
{
g.DrawImage(ReducedImage, (int)(120 - ImageWidth) / 2, 0, ImageWidth, ImageHeight);
}
g.DrawRectangle(new Pen(Color.Gray), 0, 0, 119, 119); //绘制缩略图的边框
bt.Save(@targetFilePath, ImageFormat.Jpeg); //保存缩略图
bt.Dispose(); //释放对象
ReducedImage.Dispose(); //释放对象
return true;
bdf216
2013-02-19
知道答主
回答量:7
采纳率:0%
帮助的人:1.1万
展开全部
你好LZ 我也要弄一个类似的功能 你的程序能分享下么 邮箱 bdf216@163.com 十分感谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
亚马逊选品管家
2013-01-25 · TA获得超过643个赞
知道小有建树答主
回答量:805
采纳率:100%
帮助的人:285万
展开全部
那用gc.Collect()回收一下看看。
你再注意下这行代码:
Image img = new Bitmap(Image.FromFile(s));

换成Bitmap bmp = new Bitmap(s);
估计就没问题了。
追问
感谢:youngking87   换成Bitmap bmp = new Bitmap(s);是可以历遍完 listBox1.Items 。
但我需要将Bitmap 转换成Image
用 Image img = Image .GetThumbnailImage(x, y, null, new IntPtr());这样缩小图片
历编第一个转换就出现内存不足了。 我在后面加上 gc.Collect(); 也没用。因为在历遍中第一个转换就提示内存不足了。我的历编是加一个,就转换一个,然后再释放一个。这样循环历遍的。
追答
嗯,可以啊。那下面再释放img。就好了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式