无法访问正在使用的文件

时间:2014-02-16 15:48:02

标签: c# winforms

我正在制作像桌面一样的应用程序。我正在尝试为桌面设置背景图像,但我收到了错误。

以下是选择背景图片的按钮

private void button1_Click_2(object sender, EventArgs e)
{
    OpenFileDialog open = new OpenFileDialog();
    if (open.ShowDialog() == DialogResult.OK)
    {
        Bitmap bit = new Bitmap(open.FileName);
        pictureBox1.Image = bit;
        pictureBox1.Image.Save(@"frame.jpeg", ImageFormat.Jpeg);
    }
}

这就是我关闭并重新打开应用程序时保存它的方法(On Form1 Void)

if (File.Exists(@"frame.jpeg"))
    pictureBox1.Image = Image.FromFile(@"frame.jpeg");
else
    pictureBox1.BackColor = Color.Black; //Blank

我在行pictureBox1.Image.Save(@"frame_backup.jpeg", ImageFormat.Jpeg);上收到错误,表示图片正在使用中。

我尝试PictureBox1.Image = null;来清除图片中的图像,但仍然有错误!

3 个答案:

答案 0 :(得分:0)

它仍然在内存中,将图片框设置为什么都不会解决任何问题,因为它不会从内存中处理它。为此,您可以使用.Dispose()方法。

...所以

bit.Dispose();

答案 1 :(得分:0)

正如其他人已经说过的那样,当你完成它时你应该处理BitMap对象。 处理此BitMap对象的另一种更简洁的方法是在using块中包含BitMap实现IDisposable(通过其基类Image)。

using(Bitmap bit = new Bitmap(open.FileName))
{
        pictureBox1.Image = bit;
        pictureBox1.Image.Save(@"frame.jpeg", ImageFormat.Jpeg);
}

<强> EDITED

    Bitmap bit = new Bitmap(open.FileName);
    Bitmap bitNew = new Bitmap(bit);
    bit.Dispose();
    pictureBox1.Image = bmpNew;
    pictureBox1.Image.Save(@"frame.jpeg", ImageFormat.Jpeg);
    bitNew.Dispose();

答案 2 :(得分:0)

在构建代码时,我认为您有兴趣打开图片,比如PNG格式并保存为JPEG格式。你应该这样试试:

这个答案背后的想法是使用using块,它有助于在资源不再使用时立即处置,并通过从所有者处获取资源来释放已打开的资源(请参阅ReleaseInUseResource`函数)。 / p>

    private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog open = new OpenFileDialog();
        if (open.ShowDialog() == DialogResult.OK)
        {
            ReleaseInUseResource();

            using (Bitmap bmp = new Bitmap(open.FileName))
            {
                bmp.Save(@"frame.jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
            }

            pictureBox1.Image = Bitmap.FromFile(@"frame.jpeg");
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (System.IO.File.Exists(@"frame.jpeg"))
        {
            ReleaseInUseResource();
            pictureBox1.Image = new Bitmap(@"frame.jpeg");
        }
        else
        {
            pictureBox1.BackColor = Color.Black; //Blank
        }
    }

    private void ReleaseInUseResource()
    {
        Image img = pictureBox1.Image;  // Get image used to display in picture box.
        if (img != null) img.Dispose(); // release it first if there is an image opened.
    }

希望它有所帮助!