c#应用中的图片资源释放

Image resource release in c# application

我正在使用 Windows Forms (c#) 进行图像处理项目。您可以在下面看到我的应用程序的设计。 此应用程序的作用:获取原始图像,创建副本并修改副本。

我的应用程序运行良好,但是,如果我在不关闭应用程序的情况下再次处理相同的原始图像,我会因为(我认为)显示修改后的图像而出现错误。我觉得是右下角显示占用了图片的资源,再次修改时,系统认为图片已经被其他程序使用,无法修改。

所以我的问题是:“如果用户再次单击“处理”,我如何才能停止使用修改后的图像?” 我尝试使用 .Dispose() 方法,但没有用。

链接到 PROCESS 按钮的 c# 函数代码:

private async void button8_Click(object sender, EventArgs e)
    {
        // start the waiting animation
        progressBar1.Visible = true;
        progressBar1.Style = ProgressBarStyle.Marquee;


        if (csI != csP)
        {
            MessageBox.Show("The selected profil does not match the selected image. Colorspaces are different.", "WARNING", 
                MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        else
        {
            pictureBox2.Image = null;
            if (checkBox2.Checked == false)
            {
                rendered = false;
                button8.Enabled = false;
                await Task.Run(() => wrapper.DominantColors(trackBar1.Value, rendered));
                //wrapper.DominantColors(trackBar1.Value, rendered);
            }
            else
            {
                rendering = comboBox1.Text;
                string outputImage = wrapper.Link(rendering, bpc);
                rendered = true;
                button8.Enabled = false;
                await Task.Run(() => wrapper.DominantColors(trackBar1.Value, rendered));
                //wrapper.DominantColors(trackBar1.Value, rendered);
            }

            // re-enable things
            button8.Enabled = true;
            progressBar1.Visible = false;

            MessageBox.Show("processing done");
            Bitmap bit = new Bitmap(imgDstPath);
            float WidthImg = bit.Width;
            float HeightImg = bit.Height;
            float alpha = WidthImg / pictureBox2.Width;
            float beta = HeightImg / pictureBox2.Height;
            alpha = Math.Max(alpha, beta);
            float newWidthf = WidthImg / alpha;
            float newHeightf = HeightImg / alpha;
            int newHeight = (int)newHeightf;
            int newWidth = (int)newWidthf;
            pictureBox2.ClientSize = new Size(newWidth, newHeight);
            pictureBox2.Image = bit;
            pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;

            
        }
        
        

    }

如果可以的话,我想在点击处理按钮的时候清除资源的使用

提前感谢您的帮助

基本规则是您创建的所有实现 IDisposable 的对象都需要被释放。在编写 winforms 应用程序时,所有添加到表单的控件都会在处理表单时处理。但是,每当您更改内容时,您可能需要自己处理。

例如:

pictureBox2.Image = bit;

如果 pictureBox2.Image 已经设置为您需要确保它被处理掉的东西。

var oldImage = pictureBox2.Image;
pictureBox2.Image = bit;
oldImage.Dispose();

我不确定这是否是您遇到的实际问题,您的示例代码不足以做出该决定。要发现这一点,您需要调试您的程序!首先检查您的异常,打开文件或其他资源时它是否失败?该资源是在哪里创建的?它在哪里处置?甚至可以使用内存调试器来生成所有活动对象的列表,以查看是否存在任何可疑对象。如果任意代码抛出异常,是否会正确处理?

有时在调试器中检查对象的身份、查看它是否已被切换或查看触发断点的对象有时很有用。您可以在 [=] 中右键单击监视面板中的对象24=] 和 select “Make ObjectId”,这会将数字与出现在值末尾的对象相关联。

如果以后有人想知道我找到的解决方案,请看这里: 在 PROCESS 函数的开头,我添加了这些简单的行:

if (pictureBox2.Image != null)
            {
                pictureBox2.Image.Dispose();
                pictureBox2.Image = null;}