C# 哪里是处理图像的合适位置
我有一个带有C# 哪里是处理图像的合适位置,c#,winforms,picturebox,dispose,C#,Winforms,Picturebox,Dispose,我有一个带有OpenFileDialog的表单,用于选择图像并在pictureBox中显示。在表单打开之前,用户可以打开打开的图像,然后根据需要多次保存。我想做的是,在每次新选择保存后,删除以前保存的图像(如果有)。问题是,当我现在实现代码时,我能够第一次删除图像,如果我继续使用当前打开的表单保存图像,我会得到一个错误,即资源正在使用。我所做的是Dispose() 这是我打开并加载图像的方式: private void btnExplorer_Click(object sender, Event
OpenFileDialog
的表单,用于选择图像并在pictureBox
中显示。在表单打开之前,用户可以打开打开的图像,然后根据需要多次保存。我想做的是,在每次新选择保存后,删除以前保存的图像(如果有)。问题是,当我现在实现代码时,我能够第一次删除图像,如果我继续使用当前打开的表单保存图像,我会得到一个错误,即资源正在使用。我所做的是Dispose()
这是我打开并加载图像的方式:
private void btnExplorer_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Title = "Select file";
openFileDialog1.InitialDirectory = "c:\\";
openFileDialog1.Filter = fileNameFilter;
openFileDialog1.FilterIndex = 2;
openFileDialog1.RestoreDirectory = true;
openFileDialog1.FileName = prefixFilter;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
try
{
pictureBox1.InitialImage = new Bitmap(openFileDialog1.FileName);
pictureBox1.ImageLocation = openFileDialog1.FileName;
selectedFile = pictureBox1.ImageLocation;
selectedFileName = openFileDialog1.SafeFileName;
pictureBox1.Load();
}
catch (Exception ex)
{
logger.Error(ex.ToString());
MessageBox.Show("Error loading image!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
在同一个类中,如果需要删除旧图像,我会调用这个方法:
public void DeleteImage(AppConfig imagePath, string ImageName)
{
pictureBox1.InitialImage.Dispose();//Release the image before trying to delete it
string imgPath = imagePath.ConfigValue.ToString();
File.Delete(imgPath + "\\" + ImageName);
}
如你所见。这里有Dispose()
方法,我认为该方法将确保在尝试删除资源之前将其释放,但正如我所说的那样,该方法只工作一次,然后我得到的错误次数与尝试保存图像的次数相同
附言
我得到的确切错误是:
The process cannot access the file 'C:\Images\ME_083a210e1a7644198fe1ecaceb80af52.jpg' because it is being used by another process.
有一个更好的方法。使用和加载图像,然后将其分配到pictureBox
FileStream bmp = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
Image img = new Bitmap(bmp);
pictureBox1.Image = img;
bmp.Close();
如果您想清除图片框,只需
pictureBox1.Image = null;
有一个更好的方法。使用和加载图像,然后将其分配到pictureBox
FileStream bmp = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
Image img = new Bitmap(bmp);
pictureBox1.Image = img;
bmp.Close();
如果您想清除图片框,只需
pictureBox1.Image = null;
如果我理解正确,您希望从图片框:Set中删除曾经“使用”过的图像
picturebox.InitialImage=null;
(顺便说一下:你最好使用picturebox.Image…)
“Dispose”是强制垃圾收集器从内存中删除未使用的对象
您的错误与pictureBox图像的处理无关,而是与源文件的锁定有关
如果您使用“使用”块来处理openFileDialog,可能已经有所帮助。如果我理解正确,您希望从其图片框中删除曾经“使用”过的图像:Set
picturebox.InitialImage=null;
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Title = "Select file";
openFileDialog1.InitialDirectory = "c:\\";
openFileDialog1.Filter = "Jpeg Files(*.jpg)|*.jpg|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 2;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
pictureBox1.InitialImage = new Bitmap(openFileDialog1.FileName);
pictureBox1.ImageLocation = openFileDialog1.FileName;
selectedFile = pictureBox1.ImageLocation;
selectedFileName = openFileDialog1.SafeFileName;
pictureBox1.Load();
}
}
public string selectedFileName { get; set; }
public string selectedFile { get; set; }
private void button2_Click(object sender, EventArgs e)
{
pictureBox1.ImageLocation = null;
}
(顺便说一下:你最好使用picturebox.Image…)
“Dispose”是强制垃圾收集器从内存中删除未使用的对象
您的错误与pictureBox图像的处理无关,而是与源文件的锁定有关
如果你用“使用”这个词,可能已经有帮助了块来处理openFileDialog。您得到了什么错误?@Lojko查看操作。我用我得到的错误编辑了它。您得到了什么错误?@Lojko查看操作。我用我得到的错误编辑了它。您还可以在using语句中使用FileStream作为well@VladLC++中的PICTIOBOX清除是怎么回事?为图像指定null时出错。@AnderBiguri不能不看到您的代码就说。创建一个新问题,让我know@VladL您还可以在using语句中使用FileStream作为well@VladLC++中的PICTIOBOX清除是怎么回事?为图像指定null时出错。@AnderBiguri不能不看到您的代码就说。创建一个新问题,让我know@VladL对你是对的。我在做研究,看起来真正的问题是资源被锁定了。是的。你是对的。我在做研究,看起来真正的问题是资源被锁定了。
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Title = "Select file";
openFileDialog1.InitialDirectory = "c:\\";
openFileDialog1.Filter = "Jpeg Files(*.jpg)|*.jpg|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 2;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
pictureBox1.InitialImage = new Bitmap(openFileDialog1.FileName);
pictureBox1.ImageLocation = openFileDialog1.FileName;
selectedFile = pictureBox1.ImageLocation;
selectedFileName = openFileDialog1.SafeFileName;
pictureBox1.Load();
}
}
public string selectedFileName { get; set; }
public string selectedFile { get; set; }
private void button2_Click(object sender, EventArgs e)
{
pictureBox1.ImageLocation = null;
}