C# Image.FromHbitmap() 内存不足

        Bitmap b = new Bitmap(@"d:\bb.bmp"); 
                    //图像大小 800像素X 600像素
                    //需要对像素进行一些处理,所以用上面的代码
                    //如果照片循环处理次数过多后,就提示内存不足。

        for (int i = 0; i < 40000; i++)
        {
            pictureBox1.Image = Image.FromHbitmap(b.GetHbitmap());
                            //提示内存不足

        }

                    谢谢各位前辈!

这个只是故障重现,我是批量处理一批图片,处理一部分后,就提示内存一足

 for (int i = 0; i < 40000; i++)
        {

                using (Bitmap b = new Bitmap(@"d:\bb.bmp";)
                {
            pictureBox1.Image = Image.FromHbitmap(b.GetHbitmap());
                            //提示内存不足
        }
        }
 for (int i = 0; i < 40000; i++)
        {

                using (Bitmap b = new Bitmap(@"d:\bb.bmp"))
                {
            pictureBox1.Image = Image.FromHbitmap(b.GetHbitmap());
                            //提示内存不足
        }
        }

在我的理解里,只是给pictureBox1.Image 赋值了40000次,不应该内存不足才对呀 ,我是新手 我感觉上面的例子和下面的例子差不多吧,
但下面的代码就可以

for (int i = 0; i < 40000; i++)
{
pictureBox1.Image = Image.FromFile(@"d:\bb.bmp");

    }

FromHbitmap 这个方法会创建一个gdi+ bitmap的拷贝,在创建新的Image后要使用GDI的DeleteObject方法释放资源。你没释放所以就溢出了, 而FromFile没有这个问题。

https://msdn.microsoft.com/zh-cn/library/k061we7x(v=vs.110).aspx.aspx "")

直接更新picturebox图片确实会有内存溢出的隐患,更新前需手动释放控件资源。

        for (int i = 0; i < 40000; i++)
        {
            if(pictureBox1.Image!=null)
            {
                pictureBox1.Image.Dispose();
            }
            pictureBox1.Image = Image.FromHbitmap(b.GetHbitmap());
        }

可以直接Image img = b; //Bitmap也属于Image类
pictureBox1.Image = img;

pictureBox1.Image = Image.FromHbitmap(b.GetHbitmap()); 这歌操作放在for循环里面执行4万次,肯定内存溢出了呀。