我已经在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中绘制时)?
正如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)
这样,一旦退出此块,您的文件就会被解锁,并且您将在图片框中保留图像的唯一副本.
问题在于,在执行此代码之后,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)