C# Windows窗体测距程序在打开多个图像后启动

C# Windows窗体测距程序在打开多个图像后启动,c#,winforms,graphics,C#,Winforms,Graphics,我有一个程序,允许用户打开一个图像,并通过在其上拖动鼠标来测量它。按下按钮时,图像将在图片框中打开。程序在打开两个图像后工作,但在打开三个图像后不工作。在第三幅图像之后,测量值被严重高估了。 以下是打开图像的代码部分: private void openPlan_Click(object sender, EventArgs e)// open plan folder { pictureBox1.Image = null; // open file dia

我有一个程序,允许用户打开一个图像,并通过在其上拖动鼠标来测量它。按下按钮时,图像将在图片框中打开。程序在打开两个图像后工作,但在打开三个图像后不工作。在第三幅图像之后,测量值被严重高估了。 以下是打开图像的代码部分:

private void openPlan_Click(object sender, EventArgs e)// open plan folder
    {
        pictureBox1.Image = null;

        // open file dialog   
        OpenFileDialog open = new OpenFileDialog();
        open.InitialDirectory = @"C:\Users\Admin\Documents\complete Lumber Estimation Tool\Plans\";
        // image filters  
        if (open.ShowDialog() == DialogResult.OK)
        {

            trackBar1.Value = 4;
            zoom = 1.0F;
            imgOriginal = null;
            // display image in picture box  
            imgOriginal = new Bitmap(open.FileName);

            pictureBox1.Image = imgOriginal;
       }
  }
这主要是windows窗体程序如何存储数据的问题吗?
如果是这样,我如何确保程序没有使用上一张图像中的任何数据或参数?

如我的评论所示:
始终
dispose
图像,特别是带有打开的文件句柄的图像。 使用:

而不是:
.Image=null

…更详细的信息:
Image
类正在使用
GDI
,这会导致打开句柄。这些句柄不会通过在应用程序中丢失引用而自动关闭。它们不是由政府收集的

这可能会导致应用程序出现不可预知的行为或超出此范围。
e、 g:如果您从文件加载图像,打开的句柄会导致文件锁定,如果您只是想显示图像,也会导致文件锁定。 对于这种情况,可以将整个图像加载到中间
System.IO.MemoryStream
对象中。 按如下方式封装来自原始源的图像:

var stream = new System.IO.MemoryStream(System.IO.File.ReadAllBytes(filepath));
var Image = Image.FromStream(stream);
这会将文件加载到内存中,并从中取出图像。
使用后或加载其他图像时,请小心处置流和图像。

顺便说一句:始终处置图像,特别是使用打开的文件句柄。用法:imgOriginal?.Dispose();-pictureBox1.Image?.Dispose();Thank我想我昨天用你的提示解决了这个问题,但今天我又检查了一遍,在我打开第三张图片后,似乎仍然有相同的问题。我还能做些什么来删除图像数据?@EricLopez Reyes第三张图像总是一样的吗?您必须提供代码,在何处以及如何测量-打开并不是真正的问题,现在我认为,在打开第三张图片之前,该程序对任何图片都可以正常工作。我还添加了测量代码。我在一个缩放方法中犯了一个新手错误。我想把一个特定的变量保存为200。该值除以比例因子(以处理不同大小的图片)。当图片大小相同时,新值为200/比例因子/比例因子,而不是仅200/比例因子。预期会出现类似情况-很高兴听到您找到了解决方案
var stream = new System.IO.MemoryStream(System.IO.File.ReadAllBytes(filepath));
var Image = Image.FromStream(stream);