例外:参数无效(将新图像传递给pictureBox时)

Mit*_*nca 9 c# dispose image

我已经在PictureBox控件中有一个图像,现在我想传递一个新的图像.

会发生什么,是allpication Disposes(我捕获异常:"参数无效").

这是我的代码:

            using (Image img = Image.FromFile(open.FileName))
            {
                part.Picture = img;
                pictureBox1.InitialImage = null;
                pictureBox1.Image = img;
            }    
Run Code Online (Sandbox Code Playgroud)

因此,当代码退出该方法时,它会直接显示为此主表单的Displose.我只在Form1启动的行上捕获异常.在这个问题上,没有什么可以解除的.当pictureBox正在绘画时(在Paint事件中),它一定是错误的,但我并没有被它所吸引.

我真的不知道如何解决这个问题.我甚至试图用来清除所有资源(通过调用垃圾收集),但似乎没有任何工作.


还有一件事:"part"是List的引用,所以当我尝试删除当前图像(用新图像替换它)时,我得到了另一个例外,例如:

"进程无法访问该文件,因为它正被另一个进程使用".


这是否与第一个异常有关(当新图像未在pictureBox中绘制时)?

Mad*_*bot 9

正如Reed所说,你从open.Filename中提取的图像在你退出using()语句后被处理掉了.您的图片框仍然在内存中引用此图像,因此当它被丢弃时,您也会丢失存储在图片框中的内容.

你真正需要的是你正在拉动的图像的独特副本.

    using (Image sourceImg = Image.FromFile(open.Filename))
    {
        Image clonedImg = new Bitmap(sourceImg.Width, sourceImg.Height, PixelFormat.Format32bppArgb);
        using (var copy = Graphics.FromImage(clonedImg))
        {
            copy.DrawImage(sourceImg, 0, 0);
        }
        pictureBox1.InitialImage = null;
        pictureBox1.Image = clonedImg;
    }
Run Code Online (Sandbox Code Playgroud)

这样,一旦退出此块,您的文件就会被解锁,并且您将在图片框中保留图像的唯一副本.


Ree*_*sey 5

问题在于,在执行此代码之后,pictureBox1.Image指的Image是已经处理的代码.

如果您没有将Image创建包装在一个中using,它应该纠正您的问题.

Image img = Image.FromFile(open.FileName);
part.Picture = img;
pictureBox1.InitialImage = null;
pictureBox1.Image = img; // You can't dispose of this, or it won't be valid when PictureBox uses it!
Run Code Online (Sandbox Code Playgroud)