永发信息网

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

答案:3  悬赏:40  手机版
解决时间 2021-02-06 01:33
  • 提问者网友:凉末
  • 2021-02-05 04:54
C# WinForm 循环加载图片出现内存不足
最佳答案
  • 五星知识达人网友:行路难
  • 2021-02-05 06:19
那用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。就好了。
全部回答
  • 1楼网友:低音帝王
  • 2021-02-05 07:49
首先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;追问谢谢!找到原因了。总结一下给大伙们参考参考。在微软官网上看到段解释。Bitmap 一个 图像对象从一个文件构造时该文件仍保留锁定对象的生存期。所以关键是要使用 Graphics.DrawImage() 方法来将映像复制到新位图对象。然后Bitmap和Graphics就可以释放了。然后用新位图进行缩减像素处理,保存后再释放。我新建一个线程来历遍处理较果比较好。我批量处理了12660张图片。程序的运行内存都只是在2M至8M间跳动。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯