放置图像的适当位置在哪里 [英] Where is the proper place to dispose an image

查看:94
本文介绍了放置图像的适当位置在哪里的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有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()方法在这里,尽管我会确保在尝试删除资源之前先将其丢弃,但是正如我所说的那样,该方法只工作一次,然后我得到的错误次数与尝试保存图像的次数一样多. >

PS

我得到的确切错误是:

The process cannot access the file 'C:\Images\ME_083a210e1a7644198fe1ecaceb80af52.jpg' because it is being used by another process.

解决方案

有一种更好的方法.使用 FileStream 加载图像,然后将其分配给pictureBox

FileStream bmp = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
Image img = new Bitmap(bmp);
pictureBox1.Image = img;
bmp.Close();

如果要清除图片框,只需

pictureBox1.Image = null;

I have a form with OpenFileDialog for selecting image and showing it in pictureBox. Until the form is open the user can open and then save the opened image as many times as he wants. What I want to do is, after each new selection-save, to delete the previously saved image if there is such. The problem is that as I implemented the code now I am able to delete the image the first time, if I keep on saving images with the currently open form I get an error that the resource is being used. What I do is Dispose() the image but I guess I don't do it in the right place.

This is how I open and load the image:

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);
                }
            }
        }

And in the same class I have this method which I call if I need to delete an old image:

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);
        }

As you can see. The Dispose() method is here which I though will ensure that the resource will be disposed before trying to delete it but as I said this only work once and then I get the error as many times as attempts to save image I make.

P.S

The exact error I get is:

The process cannot access the file 'C:\Images\ME_083a210e1a7644198fe1ecaceb80af52.jpg' because it is being used by another process.

解决方案

There is a better way to do it. Load the image using FileStream and than assign it to the pictureBox

FileStream bmp = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
Image img = new Bitmap(bmp);
pictureBox1.Image = img;
bmp.Close();

and if you want to clear the picture box, simply

pictureBox1.Image = null;

这篇关于放置图像的适当位置在哪里的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆