获取System.Runtime.InteropServices.ExternalException!

时间:2011-06-28 14:33:06

标签: c# .net image save undo

我正在尝试绘制图像并使用鼠标单击事件保存它。我添加了一个按钮来撤消上次绘制操作。我通过鼠标单击事件加载以前保存的图像来执行此操作。我这里有一个代码......我将在代码中的注释中显示我得到异常的部分:

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
    rect.Width = 0;
    rect.Height = 0;
    pictureBox1.Invalidate();

    pictureBox1.Image.Save(String.Format("{0}.Bmp",textBox2.Text )); //getting exception here!! 

    int radius = 10; //Set the number of pixel you want to use here

    //Calculate the numbers based on radius
    int x0 = Math.Max(e.X - (radius / 2), 0),
        y0 = Math.Max(e.Y - (radius / 2), 0),
        x1 = Math.Min(e.X + (radius / 2), pictureBox1.Width),
        y1 = Math.Min(e.Y + (radius / 2), pictureBox1.Height);

    Bitmap bm = pictureBox1.Image as Bitmap; //Get the bitmap (assuming it is stored that way)
    for (int ix = x0; ix < x1; ix++)
    {
        for (int iy = y0; iy < y1; iy++)
        {
            bm.SetPixel(ix, iy, Color.Black); //Change the pixel color, maybe should be relative to bitmap
        }
    }
    pictureBox1.Refresh(); //Force refresh
}

按钮下的代码是:

private void button2_Click(object sender, EventArgs e)
{
    pictureBox1.Load(string.Format("{0}.Bmp",textBox2.Text));
}

在我的程序中,我首先尝试保存图像然后将其绘制。当我点击按钮时它正在工作&amp;加载图像,但当我再次尝试绘制它时,我得到了例外。请帮助我需要更改代码。

1 个答案:

答案 0 :(得分:1)

问题是,当pictureBox1.Image对象正在使用该文件时,您正尝试将图像保存到文件中。

模拟问题:

string imageFilePath = string.Format("{0}.Bmp",textBox2.Text);

pictureBox1.Image.Save(imageFilePath);
pictureBox1.Load(imageFilePath);
pictureBox1.Image.Save(imageFilePath);//ExternalException will be thrown here.

您可以声明私有Image字段并在加载时将图片加载到该字段,而不是使用相同的图像文件来保留图像以前的撤消状态,而是将图像保存到它而不是将其保存到{ {1}}用于撤消。

然而,要实现强大的多撤消/重做,here是一个很好的例子,适合您的情况。