получение System.Runtime.InteropServices.ExternalException! - PullRequest
1 голос
/ 28 июня 2011

Я пытаюсь нарисовать изображение и сохранить его, используя событие щелчка мышью.Я добавил кнопку, чтобы отменить последнюю операцию рисования.Я выполняю эту операцию, загружая ранее сохраненное изображение с помощью события щелчка мыши.У меня есть код здесь ... Я покажу часть, где я получаю исключение в комментариях в коде:

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

В своей программе я сначала попытался сохранить изображение, а затем нарисовал его.Когда я нажимаю кнопку, она работает и загружает изображение, но когда я снова пытаюсь нарисовать его, я получаю исключение.Пожалуйста, помогите, где мне нужно изменить код.

1 Ответ

1 голос
/ 28 июня 2011

Проблема заключается в том, что вы пытаетесь сохранить изображение в файл, когда файл используется объектом 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 и загружать в него изображение при каждой загрузке, а также сохранять изображение в нем вместо сохранения его в pictureBox1.Image для отмены.

Однако для реализации мощного мульти-отмены / повтора здесь является хорошим примером, подходящим для вашего случая.

...