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;}
我正在使用 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;}