0

我在删除以PictureBox. 感谢Hans Passant我使用他提出的这个片段解决了这个问题:

            using (var temp = new Bitmap(openFileDialog1.FileName))
            {
                pictureBox1.Image = new Bitmap(temp);
            }

我试图使代码崩溃,但我不能让它似乎工作,但我不太了解这段代码背后的逻辑。在我做之前:

if (MyImage != null)
                    {
                        MyImage.Dispose();

                    }
...
MyImage = new Bitmap(openFileDialog1.FileName);
                    pictureBox1.Image = (Image)MyImage;

这甚至非常罕见地导致了resource being used.

为什么这不会发生在我正在使用的新代码中。我问这个是为了了解封面下发生的事情。我知道这using保证Dispose()会被调用,但Disposed()也会在前面的代码中被调用。大多数情况下,资源的释放速度足够快,但是允许新代码始终以足够快的速度释放图像以使其可以被删除或我们需要对其进行任何处理的最大区别是什么?

4

1 回答 1

2

从文件创建Bitmap对象时,只要Bitmap对象存在,它就会保持文件打开。

在您的原始代码中,您使用的是Bitmap从控件中的文件打开的对象,因此只要控件显示图像,文件就会打开。

在新代码Bitmap中,通过复制Bitmap从文件创建的对象中的数据来创建新对象。新Bitmap对象不会将连接复制到文件,因此当您处理第一个Bitmap对象时,文件将被关闭。

使用较少资源的解决方案是将文件中的数据读取到字节数组中,从中创建内存流并使用它来创建图像:

using (var m = new MemoryStream(File.ReadAllBytes(openFileDialog1.FileName))) {
  pictureBox1.Image = Image.FromStream(m);
}
于 2013-03-11T15:04:04.930 回答