我在 PictureBox 控件中已经有一个图像,现在我想向它传递一个新图像。
发生了什么,allpication Disposes(我发现了一个异常:“参数无效”)。
这是我的代码:
using (Image img = Image.FromFile(open.FileName))
{
part.Picture = img;
pictureBox1.InitialImage = null;
pictureBox1.Image = img;
}
因此,当代码离开方法时,它会直接处理此表单和主表单。我仅在启动 Form1 的行上捕获异常。在这一点上,没有任何异常(exception)。 pictureBox 正在绘制时(在 Paint 事件中)一定是出了什么问题,但我对此并不满意。
我真的不知道如何解决这个问题。我什至尝试使用清除所有资源(通过调用垃圾收集),但似乎没有任何效果。
还有一件事:“部分”是列表的引用,所以当我尝试删除当前图像(用新图像替换它)时,我遇到了另一个异常,例如:
“该进程无法访问该文件,因为它正被另一个进程使用”。
这是否与第一个异常有关(当新图像未在 pictureBox 中绘制时)?
最佳答案
正如 Reed 所指出的,一旦您退出 using() 语句,您从 open.Filename 中提取的图像就会被处理掉。您的图片框仍在内存中引用此图像,因此当它被处置时,您也会丢失存储在图片框中的内容。
您真正需要的是您正在拉取的图像的唯一副本。
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;
}
这样,您的文件将在您退出此 block 后立即解锁,并且您将在图片框中保留图像的唯一副本。
关于c# - 异常 : Parameter is not valid (on passing new image to pictureBox),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12680618/