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并不能及时释放资源。
高手门,有什么方法可以及时释放资源的?指点下啊!感激不尽! 展开
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并不能及时释放资源。
高手门,有什么方法可以及时释放资源的?指点下啊!感激不尽! 展开
3个回答
展开全部
首先i=i++;就是不对的。
再者你的图片多大啊,27张就用了1.5g的内存。
再者你的图片多大啊,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;
展开全部
你好LZ 我也要弄一个类似的功能 你的程序能分享下么 邮箱 bdf216@163.com 十分感谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那用gc.Collect()回收一下看看。
你再注意下这行代码:
Image img = new Bitmap(Image.FromFile(s));
换成Bitmap bmp = new Bitmap(s);
估计就没问题了。
你再注意下这行代码:
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。就好了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询