我正在尝试绘制图像并使用鼠标单击事件保存它。我添加了一个按钮来撤消上次绘制操作。我通过鼠标单击事件加载以前保存的图像来执行此操作。我这里有一个代码......我将在代码中的注释中显示我得到异常的部分:
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;加载图像,但当我再次尝试绘制它时,我得到了例外。请帮助我需要更改代码。
答案 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是一个很好的例子,适合您的情况。